Windows cmd向MySQL 5.7插入中文字符报错1366的问题求助
排查思路与解决方案建议
我碰到过不少类似的MySQL中文编码插入失败的问题,结合你的Win7+CMD CP936+MySQL5.7的场景,给你梳理几个关键排查方向:
1. 先确认MySQL字符集的实际配置
虽然你提到了字符转换流程,但建议手动核对当前会话和表的字符集参数,避免截图信息可能存在的偏差:
- 在CMD的MySQL客户端里执行:
重点关注这几个参数:SHOW VARIABLES LIKE '%character%';character_set_client(客户端发数据的编码)、character_set_connection(MySQL接收后的转换编码)、character_set_database(当前数据库默认编码)。 - 同时确认表字段的字符集,执行:
一定要看SHOW CREATE TABLE cs_2;direction字段是否明确指定了gbk,有没有可能继承了其他字符集(比如latin1)?
2. 验证CMD中中文的实际编码
你的CMD代码页是CP936(对应GBK),但有可能输入法到CMD的编码传递出了问题:
- 先在CMD里做个小测试:输入
echo 出 > test.txt,然后用Notepad++打开这个文件,查看它的编码。如果显示是ANSI(对应Win7中文环境的GBK),那说明CMD输出的是正确的GBK编码;如果是UTF-8或其他,那说明输入法到CMD的转换有问题。 - 另外可以在MySQL里执行
SELECT HEX('出');,正常GBK编码的“出”应该返回B3F6。如果返回的是BA或者其他奇怪的值,说明MySQL收到的字节已经不对了,大概率是character_set_client配置错了(比如设成了latin1)。
3. 检查字段的长度与字符集匹配
“出”的GBK编码是2个字节,如果你direction字段的长度设置的是VARCHAR(1),在GBK字符集下是可以存的(因为MySQL的VARCHAR长度是字符数,不是字节数)。但如果字段的字符集是latin1,那VARCHAR(1)只能存1个字节,插入2字节的GBK字符就会报错。这一点一定要确认清楚。
4. 手动指定会话字符集尝试
有时候全局配置和会话配置不一致,你可以在插入语句前先执行:
SET NAMES gbk;
这个命令会把character_set_client、character_set_connection、character_set_results都设为gbk,然后再执行你的插入语句。如果成功了,说明之前的会话字符集配置有问题,可能需要修改MySQL的配置文件(my.ini)来永久生效。
5. 查看MySQL错误日志找细节
如果以上方法都没解决问题,可以去MySQL的data目录下找错误日志(一般是主机名.err文件),里面会有更详细的字符转换报错信息,能帮你定位到底是哪一步出了问题。
内容的提问来源于stack exchange,提问作者shawnwinder
相关产品推荐
相关产品推荐

