MySQL 8.0字符编码异常求助:导入数据后é显示为Ú的原因排查
问题分析与解决
核心原因
你的test.sql文件采用latin1编码(其中字符é对应的字节是0xE9),但当前MySQL客户端的连接编码(character_set_client、character_set_connection)是cp850,导致编码解析错位:
- 执行
source时,MySQL按cp850编码读取SQL文件,把0xE9解析为cp850字符集中的Ú; - 随后将
Ú转换为latin1编码的0xDA存储到表中; - 查询时,MySQL把
0xDA转回cp850编码的0xE9,最终客户端显示Ú。
解决方法
方法1:临时修改会话编码后导入
在执行source命令前,先将客户端连接编码改为与SQL文件一致的latin1:
SET NAMES latin1;
这条命令会同时修改character_set_client、character_set_connection、character_set_results为latin1,确保MySQL正确解析SQL文件中的é,存储和查询时编码匹配。
执行完后再导入文件:
source test.sql;
方法2:转换SQL文件编码为cp850
将test.sql文件的编码转换为cp850(可通过文本编辑器如Notepad++的「编码」菜单完成),此时文件中é对应的字节会变为0x82(cp850中é的编码)。导入时MySQL按cp850解析,能正确转换为latin1的0xE9存储,查询时返回cp850编码的0x82,客户端显示é。
方法3:长期修改客户端默认编码
如果经常处理latin1编码的文件,可修改MySQL客户端配置文件(Windows下为my.ini,位于wamp64/bin/mysql/mysql8.0.31/目录),添加以下配置:
[client] default-character-set=latin1
重启MySQL服务后,客户端连接默认使用latin1编码,无需每次手动修改。
验证方法
导入完成后,可通过以下SQL验证存储的字符是否正确:
SELECT HEX(titre) FROM chapitres;
若结果为E9,说明存储的是latin1编码的é,符合预期。
内容的提问来源于stack exchange,提问作者pure_func
相关产品推荐
相关产品推荐

