utf8
của MySQL mã hóa không phải là không UTF-8 thực tế. Đó là một mã hóa tương tự như UTF-8, nhưng chỉ hỗ trợ một tập hợp con của những gì UTF-8 hỗ trợ. utf8mb4
là thực tế UTF-8. Sự khác biệt này là chi tiết triển khai nội bộ của MySQL. Cả hai đều trông giống như UTF-8 về mặt PHP. Cho dù bạn sử dụng utf8
hoặc utf8mb4
, PHP sẽ nhận UTF-8 hợp lệ trong cả hai trường hợp.
Điều bạn cần đảm bảo là mã hóa kết nối giữa PHP và MySQL được đặt thành utf8mb4
. Nếu nó được đặt thành utf8
, MySQL sẽ không hỗ trợ tất cả các ký tự. Bạn đặt mã hóa kết nối này bằng mysql_set_charset()
, bộ ký tự PDO charset
Tham số kết nối DSN hoặc bất kỳ phương thức nào khác phù hợp với API cơ sở dữ liệu của bạn mà bạn lựa chọn.
mb_internal_encoding
chỉ cần đặt giá trị mặc định cho $encoding
tham số tất cả mb_*
chức năng có. Nó không liên quan gì đến MySQL.
UTF-8 và UTF-32 khác nhau về cách chúng mã hóa các ký tự. UTF-8 sử dụng tối thiểu 1 byte cho một ký tự và tối đa là 4. UTF-32 luôn luôn sử dụng 4 byte cho mọi ký tự. UTF-16 sử dụng tối thiểu 2 byte và tối đa là 4.
Do độ dài thay đổi, UTF-8 có một chút chi phí nhỏ. Một ký tự có thể được mã hóa thành 2 byte trong UTF-16 có thể lấy 3 hoặc 4 trong UTF-8; mặt khác, UTF-16 không bao giờ sử dụng ít hơn hơn 2 byte. Nếu bạn đang lưu trữ nhiều văn bản châu Á, UTF-16 có thể sử dụng ít bộ nhớ hơn. Nếu hầu hết văn bản của bạn là tiếng Anh / ASCII, UTF-8 sử dụng ít dung lượng hơn. UTF-32 luôn sử dụng nhiều bộ nhớ nhất.