MySQL服务端必须设为utf8mb4,phpMyAdmin仅是前端无法改变底层字符集;若MySQL启动时用latin1或utf8(即utf8mb3),则新建库表默认错误,需修改配置文件并重启服务,同时phpMyAdmin config.inc.php须显式指定charset、connection_charset和connection_collation为utf8mb4_unicode_ci,旧数据乱码须先用HEX()确认真实编码再精准转换。
MySQL服务端必须设为utf8mb4
phpmyadmin自己改不了底层字符集,它只是个前端。如果mysql启动时用的是latin1或utf8(即utf8mb3),那无论phpmyadmin怎么配,新建库表默认都是错的。
执行SHOW VARIABLES LIKE 'character_set_server';,如果不是utf8mb4,就得改MySQL配置文件:
- Linux下编辑
/etc/mysql/my.cnf,Windows下是my.ini - 在
[mysqld]段落里加两行:character-set-server = utf8mb4和collation-server = utf8mb4_unicode_ci - 重启MySQL服务,再查一遍变量确认生效
phpMyAdmin config.inc.php要显式指定charset
光靠MySQL服务端还不够。phpMyAdmin连接时默认发SET NAMES utf8,在MySQL 8.0+里这实际等价于utf8mb3,emoji照样存不进去。
打开config.inc.php,找到对应服务器配置块(通常是$cfg['Servers'][$i]),补全这三项:
$cfg['Servers'][$i]['charset'] = 'utf8mb4';$cfg['Servers'][$i]['connection_charset'] = 'utf8mb4';-
$cfg['Servers'][$i]['connection_collation'] = 'utf8mb4_unicode_ci';(别用utf8mb4_0900_ai_ci,旧版phpMyAdmin可能不识别)
导出SQL文件时UTF-8编码选项不是连接层设置
很多人以为勾选「UTF-8 编码」就万事大吉,其实这个选项只控制导出的SQL文件里字符串字面量的编码(比如INSERT INTO ... VALUES ('?');里的?怎么写进文件),跟数据库连接完全无关。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
导出前务必确认两点:
- 页面右上角显示的当前连接字符集是
utf8mb4(不是utf8) - 导出方法选
Custom,在「格式特定选项」里勾上「UTF-8 编码」 - 如果导出后恢复时报
Incorrect string value,八成是连接层没设对,而不是导出文件本身问题
旧数据乱码不能靠ALTER TABLE CONVERT硬转
已有表里显示问号或方块,不代表数据坏了。可能是原来存的是UTF-8字节,但被当latin1读出来过,再CONVERT TO CHARACTER SET utf8mb4会二次损坏。
先用SELECT HEX(column_name) FROM table_name LIMIT 1;看真实字节:
- 返回
E4B8ADE69687→ 原数据是UTF-8,只需改列声明:ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 返回
C4E3CAC0CDB3→ 原数据是GBK,得按真实编码转换,不能直接设utf8mb4
真正麻烦的是四层全对齐之后,还要盯着PHP连接层——哪怕表、库、服务端、phpMyAdmin全设对了,PDO或mysqli没调set_charset('utf8mb4'),插入emoji依然失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










