MySQL配置utf8mb4后特定日文汉字显示为问号问题排查求助
问题排查方向
1. 字符集全链路匹配检查
「𣘺」属于Unicode扩展区汉字,UTF-8编码占4字节,常用的3字节日文字符能正常存储仅说明基础字符兼容,4字节字符要求从连接、服务端到字段的所有链路都启用utf8mb4才可以正常处理:
- 检查连接会话字符集:执行SQL
SHOW VARIABLES LIKE '%character%';,确认character_set_client、character_set_connection、character_set_results三个变量值均为utf8mb4。如果不是,建立连接后主动执行SET NAMES utf8mb4;,或在连接驱动配置中显式指定字符集为utf8mb4,禁止配置为utf8(MySQL原生utf8为阉割版utf8mb3,仅支持3字节以内字符)。 - 检查字段级字符集:仅修改表级字符集不会自动同步已有字段的字符集,执行以下SQL单独修改目标字段:
也可以执行ALTER TABLE 你的表名 MODIFY 目标字段名 原字段类型 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;SHOW FULL COLUMNS FROM 你的表名;确认字段的字符集和排序规则是否为utf8mb4开头。
2. MySQL服务端配置检查
编辑CentOS 7上的MySQL配置文件/etc/my.cnf,添加以下配置后重启MySQL服务生效:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' [client] default-character-set = utf8mb4
3. 操作系统与终端配置检查
- 执行
locale命令查看系统默认字符集,确认LANG、LC_ALL变量值为UTF-8格式(如ja_JP.UTF-8、zh_CN.UTF-8均可),如果不是可以修改/etc/locale.conf后重启系统生效。 - 确认你连接CentOS使用的SSH终端编码设置为UTF-8,避免输入、回显阶段就出现编码转换错误。
- 验证存储是否正常:执行
SELECT HEX(目标字段名) FROM 你的表名 WHERE 条件;查询该字符的十六进制值,正确值应为F0A398BA,如果返回3F(问号的ASCII码)说明写入阶段就出现了转码丢失,如果返回正确值说明是终端/客户端显示问题,存储本身没有异常。
内容的提问来源于stack exchange,提问作者Fancy
相关产品推荐
相关产品推荐

