MySQL 5.6存储Emoji显示为问号的问题咨询
解决MySQL 5.6存储Emoji变为问号的问题
我碰到过好几个朋友遇到这个情况——明明表和字段都已经设成utf8mb4了,插入Emoji还是变成问号,核心问题几乎都是连接层的字符集没跟上,MySQL 5.6在这里有不少容易踩的坑,给你一步步排查解决:
1. 先检查数据库连接的字符集配置
这是最常见的原因!不管你用的是Java JDBC、PHP PDO还是其他语言的数据库驱动,连接字符串里必须明确指定utf8mb4:
- 比如JDBC连接串要改成:
jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8mb4 - 如果是命令行登录MySQL,一定要加参数:
mysql -u username -p --default-character-set=utf8mb4
要是连接的时候没指定utf8mb4,哪怕表是utf8mb4,数据在传输过程中还是会被转成utf8(最多3字节),Emoji这种4字节字符自然就变成问号了。
2. 验证MySQL的全局/会话字符集
执行下面的SQL看看当前字符集设置:
SHOW VARIABLES LIKE '%character%'; SHOW VARIABLES LIKE '%collation%';
重点看这几个变量,必须是utf8mb4:
character_set_client(客户端发送数据的字符集)character_set_connection(连接层的字符集)character_set_results(返回给客户端的字符集)
如果这几个是utf8,可以先临时设置会话变量测试:
SET NAMES utf8mb4;
然后再插入Emoji试试,如果这次成功了,说明需要修改MySQL的配置文件(my.cnf或my.ini),永久生效:
[mysqld] # MySQL 5.6要用character-set-server,不要用default-character-set character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4
改完记得重启MySQL服务,再重新登录检查变量是否生效。
3. 确认驱动版本兼容性
MySQL 5.6对utf8mb4的支持没问题,但要确保你的数据库驱动版本足够新:
- JDBC驱动至少要5.1.37及以上,旧版本可能不识别
utf8mb4这个参数 - PHP的mysqli或PDO也要确保版本支持utf8mb4连接
4. 验证插入结果
插入Emoji后,用这条SQL查看字段的十六进制值:
SELECT HEX(your_longtext_column) FROM your_table;
正常的Emoji(比如😀)十六进制应该是F09F9880(4字节),如果看到的是3F(问号的十六进制),说明还是有转码环节出问题了,回到前面的步骤排查。
内容的提问来源于stack exchange,提问作者Pawan Verma
相关产品推荐
相关产品推荐

