2026-02-01
先明确:emoji 的编码特性
emoji 表情属于 Unicode 字符,它的编码长度是4 个字节,而我们之前提到的 MySQL 原生utf8最多只支持 3 个字节,所以如果用utf8编码,emoji 会被截断、存储为?或者乱码;而utf8mb4支持 4 个字节编码,正好可以完整容纳 emoji,实现正常存储和显示。
先搞懂:为什么不选utf8,要选utf8mb4?
MySQL 里的utf8是一个 "伪 UTF-8":
它最多只支持3 个字节的 UTF-8 编码,无法存储一些特殊字符(比如 emoji 表情、部分生僻汉字、韩语特殊字符、数学符号等)。
而utf8mb4是完整的 UTF-8 编码,支持4 个字节的字符,能够覆盖所有 Unicode 字符,解决了特殊字符无法存储、存储后变成?或乱码的问题。
两者在性能上几乎没有差异,utf8mb4的兼容性和完整性远超utf8,没有理由不选择它。
mysqli:设置连接编码为utf8mb4(必须在执行查询前设置)
mysqli_set_charset($conn, "utf8mb4");
PDO:在DSN中指定编码为utf8mb4(charset=utf8mb4)
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
创建数据库和数据表时,必须指定编码为utf8mb4,排序规则推荐utf8mb4_unicode_ci(兼容性更好)。