Sự khác biệt giữa bộ ký tự utf8mb4 và utf8 trong MySQL là gì?


341

Sự khác biệt giữa utf8mb4utf8bảng mã trong MySQL là gì?

Tôi đã biết về mã hóa ASCII , UTF-8 , UTF-16UTF-32 ; nhưng tôi tò mò muốn biết sự khác biệt của utf8mb4nhóm mã hóa với các loại mã hóa khác được định nghĩa trong Máy chủ MySQL .

Có bất kỳ lợi ích đặc biệt / đề xuất sử dụng utf8mb4hơn là utf8?

Câu trả lời:


391

UTF-8 là một mã hóa có độ dài thay đổi. Trong trường hợp UTF-8, điều này có nghĩa là việc lưu trữ một điểm mã yêu cầu một đến bốn byte. Tuy nhiên, mã hóa của MySQL có tên là "utf8" (bí danh của "utf8mb3") chỉ lưu trữ tối đa ba byte cho mỗi điểm mã.

Vì vậy, bộ ký tự "utf8" / "utf8mb3" không thể lưu trữ tất cả các điểm mã Unicode: nó chỉ hỗ trợ phạm vi 0x000 đến 0xFFFF, được gọi là " Mặt phẳng đa ngôn ngữ cơ bản ". Xem thêm So sánh các bảng mã Unicode .

Đây là những gì (phiên bản trước của cùng một trang tại) tài liệu MySQL phải nói về nó:

Bộ ký tự có tên utf8 [/ utf8mb3] sử dụng tối đa ba byte cho mỗi ký tự và chỉ chứa các ký tự BMP. Kể từ MySQL 5.5.3, bộ ký tự utf8mb4 sử dụng tối đa bốn byte cho mỗi ký tự hỗ trợ các ký tự bổ sung:

  • Đối với một ký tự BMP, utf8 [/ utf8mb3] và utf8mb4 có các đặc điểm lưu trữ giống hệt nhau: cùng một giá trị mã, cùng mã hóa, cùng độ dài.

  • Đối với một ký tự bổ sung, utf8 [/ utf8mb3] hoàn toàn không thể lưu trữ ký tự đó , trong khi utf8mb4 yêu cầu bốn byte để lưu trữ nó. Vì utf8 [/ utf8mb3] hoàn toàn không thể lưu trữ ký tự, nên bạn không có bất kỳ ký tự bổ sung nào trong các cột utf8 [/ utf8mb3] và bạn không cần lo lắng về việc chuyển đổi ký tự hoặc mất dữ liệu khi nâng cấp dữ liệu utf8 [/ utf8mb3] từ các phiên bản cũ hơn của MySQL.

Vì vậy, nếu bạn muốn cột của mình hỗ trợ lưu trữ các ký tự nằm ngoài BMP (và bạn thường muốn), chẳng hạn như biểu tượng cảm xúc , hãy sử dụng "utf8mb4". Xem thêm Các ký tự Unicode không BMP phổ biến nhất trong sử dụng thực tế là gì? .


10
Các trường hợp duy nhất tôi gặp phải (cho đến nay) trong đó utf8mb4 là 'bắt buộc' là tiếng Trung Quốc và Biểu tượng cảm xúc. Có bảng chữ cái tối nghĩa cần nó.
Rick James

10
Nó cũng được yêu cầu nếu bạn sử dụng để giữ mật khẩu và dữ liệu được mã hóa trong cơ sở dữ liệu của bạn. Tôi đã giữ mật khẩu được mã hóa trong mysql bằng định dạng utf8 bình thường, điều này gây cho tôi rất nhiều rắc rối với một số mật khẩu ngẫu nhiên và rất khó gỡ lỗi nên cuối cùng tôi đã thử sử dụng mã hóa base64 và khắc phục sự cố tạm thời. Nhưng, bây giờ tôi biết lý do.
Mojtaba Rezaeian

37
@idealidea dữ liệu được mã hóa là nhị phân và bạn không nên lưu trữ dữ liệu nhị phân trong một cột varchar. :)
CodeCaster

8
@thomasrutter Hãy thử ký tự (𡞰) này để lưu với UTF-8. :)
502_

2
@MojtabaRezaeian nó phụ thuộc vào thuật toán mật khẩu phần nào - bcrypt2 sẽ tạo ra ASCII.
Jasen

60

Bộ utf8mb4ký tự rất hữu ích vì ngày nay chúng ta cần hỗ trợ để lưu trữ không chỉ các ký tự ngôn ngữ mà cả các biểu tượng, biểu tượng cảm xúc mới được giới thiệu, v.v.

Một bài đọc hay về Cách hỗ trợ Unicode đầy đủ trong cơ sở dữ liệu MySQL của Mathias Bynens cũng có thể làm sáng tỏ điều này.


11
MySQL 8.0 hiện được mặc định là bộ ký tự utf8mb4. [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk

47

Lấy từ Hướng dẫn tham khảo MySQL 8.0 :

  • utf8mb4: Mã hóa UTF-8 của bộ tự Unicode sử dụng một đến bốn byte cho mỗi ký tự.

  • utf8mb3: Mã hóa UTF-8 của bộ tự Unicode sử dụng một đến ba byte cho mỗi ký tự.

Trong MySQL utf8 hiện là một bí danh cho utf8mb3bị phản đối và sẽ được loại bỏ trong một tương lai MySQL phát hành. Tại thời điểm đó utf8 sẽ trở thành một tài liệu tham khảo utf8mb4 .

Vì vậy, bất kể bí danh này, bạn có thể tự đặt ra một utf8mb4mã hóa.

Để hoàn thành câu trả lời, tôi muốn thêm nhận xét của @ WilliamEntriken bên dưới (cũng được lấy từ hướng dẫn):

Để tránh sự mơ hồ về ý nghĩa của utf8, hãy xem xét chỉ định utf8mb4rõ ràng cho các tham chiếu tập ký tự thay vì utf8.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.