必须全链路设为utf8mb4,缺一环emoji就存不进去或变问号;MySQL服务端需在my.cnf中配置character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci并重启,phpMyAdmin配置文件也要显式设charset=utf8mb4,SQL文件须UTF-8无BOM编码且开头加SET NAMES utf8mb4,数据库/表/字段字符集均需为utf8mb4,命令行导入须加--default-character-set=utf8mb4参数。

必须全链路设为 utf8mb4,缺一环 emoji 就存不进去或变问号。 phpMyAdmin 本身不决定字符集,它只是把你的 SQL 发给 MySQL;真正起作用的是 MySQL 服务端、连接层、数据库/表/列四级、以及 SQL 文件本身的编码和声明——这五处任意一个卡在 utf8(即 utf8mb3)或 latin1,emoji 就会报 incorrect string value 或静默变成 ???。
MySQL 服务端和连接层必须设 utf8mb4
只改 phpMyAdmin 配置没用,MySQL 启动时默认字符集不对,所有后续操作都白搭:
- 编辑
/etc/mysql/my.cnf(Linux)或my.ini(Windows),在[mysqld]段加两行:character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci - 同时加
init_connect = 'SET NAMES utf8mb4',确保普通用户连接自动生效(注意:对root或有SUPER权限的用户无效) - 重启 MySQL:
sudo systemctl restart mysql(或对应服务名) - 验证是否生效:
SHOW VARIABLES LIKE 'character_set_server';和SHOW VARIABLES LIKE 'collation_server';,输出值必须是utf8mb4和utf8mb4_unicode_ci
phpMyAdmin 配置文件要显式指定 charset
phpMyAdmin 默认可能仍用 utf8 初始化连接,而 MySQL 8.0+ 已弃用该别名,实际走的是 utf8mb3,emoji 直接被截断:
- 打开
config.inc.php,找到服务器配置段(通常是$cfg['Servers'][$i]) - 添加或修改这两项:
$cfg['Servers'][$i]['charset'] = 'utf8mb4';$cfg['Servers'][$i]['connection_charset'] = 'utf8mb4'; - 如果已存在
$cfg['DefaultCharset'],也设为'utf8mb4' - 保存后清空浏览器缓存再重进 phpMyAdmin,避免旧连接复用
导入前检查 SQL 文件和目标库表结构
即使服务端和 phpMyAdmin 都配对了,SQL 文件本身或目标表结构不匹配,emoji 还是存不进去:
立即学习“PHP免费学习笔记(深入)”;
- 用 VS Code 或 Notepad++ 确认 SQL 文件是 UTF-8 无 BOM 编码(不是 UTF-8 with BOM,也不是 ANSI)
- 在 SQL 文件最开头手动加一行:
SET NAMES utf8mb4;(强制本次会话使用正确编码) - 导入前先点左侧数据库名,确认顶部导航栏显示
your_db_name »;否则报#1046 - No database selected - 目标数据库、表、字段的字符集都得是
utf8mb4:
– 新建库时选utf8mb4_unicode_ci排序规则
– 已有表执行:ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
– 若字段是TEXT类型,CONVERT TO不生效,需显式MODIFY COLUMN
大文件或命令行导入时别漏掉客户端参数
用 mysql 命令行导入时,默认连接用的是 latin1,中文和 emoji 全部变问号:
- 必须加
--default-character-set=utf8mb4参数:mysql --default-character-set=utf8mb4 -u root -p your_db - 如果用 Navicat / DBeaver,连接设置里必须显式勾选或填写:
– Navicat:连接属性 → 高级 → 勾「使用 MySQL 字符集」并设为utf8mb4
– DBeaver:驱动属性 →characterEncoding=utf8mb4,且serverTimezone也要设(如Asia/Shanghai) - 导入后验证是否真存进去了:
SELECT HEX(your_column) FROM your_table LIMIT 1;,正常 emoji 应返回类似F09F988A(? 的 UTF-8 编码),不是3F3F(??)
最容易被忽略的是:ALTER TABLE CONVERT TO CHARACTER SET utf8mb4 只改元数据,不会修复已损坏的老数据。如果之前是用 latin1 插入的 emoji,它们早就被截断或替换成问号,再怎么转都救不回来——得从源头重导,或者用 HEX() + 手动 MODIFY 精准修复。



















