在使用mysql命令行客户端时,中文数据变成问号或奇怪符号是常见问题。根本原因多为客户端、连接、服务端三层字符集不匹配。下面先了解排查与解决的具体做法。

一、确认当前字符集状态
进入mysql命令行后,执行如下语句查看各项字符集:
show variables like 'character_set%';
重点关注character_set_client、character_set_connection与character_set_results,若它们不是utf8或utf8mb4,就容易出现乱码。
二、临时解决乱码
在当前会话中执行以下命令,统一客户端到服务端的编码:
set names utf8mb4;
该命令等价于同时设置client、connection、results为utf8mb4。执行后重新查询或插入中文,一般可正常显示。
使用终端时也要注意
如果系统是Windows,cmd默认代码页可能不是utf8,可先执行:
chcp 65001 </p> <p>再启动mysql客户端。Linux终端则需确认环境变量LANG含UTF-8。</p> <h2>三、永久修改配置</h2> <p>编辑mysql配置文件,在[mysqld]与[client]段补充字符集设置,避免每次重连都要set names。</p> <pre class=brush:ini;toolbar:false> [mysqld] character-set-server=utf8mb4 [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
修改后重启mysql服务即可生效。
四、建库建表时指定字符集
即便连接正常,库表字符集不对也会乱码。创建时显式声明:
create database test_db character set utf8mb4; use test_db; create table t1 ( id int primary key, name varchar(50) ) character set utf8mb4;
五、常见误区
- 只用set names utf8却忘了终端本身编码,仍会显示异常
- 服务端是utf8mb4但表是latin1,插入中文变乱码
- 使用<input>这类标签名称时误写为真实标签,文档编辑出错
统一客户端、连接、结果、库表四层字符集,是根治mysql命令行乱码的核心思路。