为什么本地WAMP环境下MySQL存储UTF-8字符会显示问号?
问题根因
这个问题是本地WAMP环境的MySQL连接/客户端字符集配置和表使用的utf8mb4不匹配导致的,插入时的Unicode右单引号’在转码过程中丢失,被替换为问号。生产环境因为字符集配置完整所以没有问题。
排查&修复步骤
- 第一步:先执行命令查看当前本地环境的字符集配置
show variables like '%char%';
正常支持utf8mb4的配置应该满足:
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_results = utf8mb4
character_set_database = utf8mb4
- 第二步:临时测试修复,每次连接数据库后先执行一次设置字符集的命令,再执行插入操作验证
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
执行后重新插入测试数据,查询如果显示正常就说明是字符集配置问题。
- 第三步:永久修改WAMP的MySQL配置,避免每次连接都手动设置
- 打开WAMP的MySQL配置文件my.ini(可以通过WAMP托盘菜单直接找到MySQL的配置文件入口)
- 在[mysqld]节点下添加/修改如下配置:
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci - 在[client]节点下添加/修改如下配置:
default-character-set = utf8mb4 - 保存配置后重启WAMP的MySQL服务即可生效。
额外注意事项
如果是用PHP代码插入数据,也需要在建立数据库连接后指定字符集,比如用PDO的话可以在DSN里指定charset=utf8mb4,用mysqli的话调用mysqli_set_charset($conn, 'utf8mb4'),避免PHP层面的转码问题。
内容的提问来源于stack exchange,提问作者saurabh yadav
相关产品推荐
相关产品推荐

