数据库中文乱码是个比较常见的问题,今天笔者就遇到了。系统环境:macOS Sierra 10.12.6
MySQL 版本:5.7.18 Homebrew
连接软件:Navicat Premium 12.0.12 TNT edition
1. MySQL程序问题1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#启动
mysql.server start
#关闭
mysql.server stop
#执行mysql命令
mysql;
#查看编码设置[下面显示的是已经设置好的]
mysql> show variables like '%char%';
+--------------------------+--------------------------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/Cellar/mysql/5.7.18_1/share/mysql/charsets/ |
+--------------------------+--------------------------------------------------------+与客户端(网页或软件:web/终端/数据库管理工具)有关的:character_set_client:对客户端的请求字符串进行编码
character_set_connection:连接服务器时的默认编码,例如navicat连接阿里云服务器
character_set_results:表示客户端想以哪种编码接收查询结果
如果后两个没有特别指定,则默认和character_set_client是一样的
与服务器端(增删查改命令)有关的:character_set_server:服务器编码
character_set_database:创建数据库时的默认编码
如果后一个没有特别指定,则默认和character_set_server是一样的
其他:character_set_filesystem:以二进制文件进行设置,不影响字符显示
character_set_system:用于mysql存储标识符,一直是UTF8,也不影响字符显示
因此如果字符编码有异常,我们只需要在my.cnf中对character_set_client与character_set_server进行设置就ok了。1
2
3
4
5#默认路径下,配置文件加载的先后顺序
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
但是我的系统是通过 homebrew 安装的 MySQL,默认情况下没有 my.cnf 文件。1cd /etc && touch my.cnf
使用 vi 编辑器将下面内容写入 /etc/my.cnf 。1
2
3
4[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
保存退出,然后停止 MySQL(mysql.server stop),并重新启动 MySQL(mysql.server start),并用以下命令校验字符编码信息。1
2
3
4#执行mysql命令
mysql -uroot -proot;
#查看编码设置[下面显示的是已经设置好的]
mysql> show variables like '%char%';
2. MySQL 数据库数据问题
如果显示的数据查询结果还是乱码,可能就是之前创建的数据库或数据表有问题了,可以通过以下方式进行检查。查询数据库支持的所有字符集1show character set;或者show char set;
查看mysql服务器当前状态1status或者\s
查看数据库编码1show create database dbname;
查看数据表编码1show create table tablename\G;
查看数据表字段编码1show full columns from tablename;
如果发现编码不是 UTF-8,请重新创建相应的数据库/数据表/字段 。
3. Mac终端-iTerm2软件设置
这一种情况比较少见,就是Mac终端不支持显示中文,这样也会导致乱码。
一方面对终端软件如iterm2的软件偏好设置进行修改为utf-8。
另一方面就是在终端执行以下语句:1
2LANG='zh_CN.UTF-8';
export $LANG;
4. MySQL 管理工具—Navicat 软件设置
笔者这次遇到的问题就属于最后一种,前面的数据库配置,查看的编码都是正确的,并且使用程序查询出来的也没有乱码,偏偏 Navicat 显示数据表时中文便乱码了,那么请新建mysql服务器连接,Encoding那一栏不要选择默认的 UTF-8,选择Auto即可正常显示中文。
5. 参考
Mac系统解决MySQL乱码问题