Mac 下彻底解决 mysql 中文乱码问题

数据库中文乱码是个比较常见的问题,今天笔者就遇到了。

系统环境:macOS Sierra 10.12.6
MySQL 版本:5.7.18 Homebrew
连接软件:Navicat Premium 12.0.12 TNT edition

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/ |
+--------------------------+--------------------------------------------------------+
  1. 与客户端(网页或软件:web/终端/数据库管理工具)有关的:

    • character_set_client:对客户端的请求字符串进行编码
    • character_set_connection:连接服务器时的默认编码,例如navicat连接阿里云服务器
    • character_set_results:表示客户端想以哪种编码接收查询结果

    如果后两个没有特别指定,则默认和character_set_client是一样的

  2. 与服务器端(增删查改命令)有关的:

    • character_set_server:服务器编码
    • character_set_database:创建数据库时的默认编码

    如果后一个没有特别指定,则默认和character_set_server是一样的

  3. 其他:

    • 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 文件。

1
cd /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%';

MySQL 数据库数据问题

如果显示的数据查询结果还是乱码,可能就是之前创建的数据库或数据表有问题了,可以通过以下方式进行检查。

  1. 查询数据库支持的所有字符集

    1
    show character set;或者show char set;
  2. 查看mysql服务器当前状态

    1
    status或者\s
  3. 查看数据库编码

    1
    show create database dbname;
  4. 查看数据表编码

    1
    show create table tablename\G;
  5. 查看数据表字段编码

    1
    show full columns from tablename;

如果发现编码不是 UTF-8,请重新创建相应的数据库数据表字段

Mac终端-iTerm2软件设置

这一种情况比较少见,就是Mac终端不支持显示中文,这样也会导致乱码。
一方面对终端软件如iterm2的软件偏好设置进行修改为utf-8。
另一方面就是在终端执行以下语句:

1
2
LANG='zh_CN.UTF-8';
export $LANG;

MySQL 管理工具—Navicat 软件设置

笔者这次遇到的问题就属于最后一种,前面的数据库配置,查看的编码都是正确的,并且使用程序查询出来的也没有乱码,偏偏 Navicat 显示数据表时中文便乱码了,那么请新建mysql服务器连接,Encoding那一栏不要选择默认的 UTF-8,选择Auto即可正常显示中文。


本文参考:

  1. Mac系统解决MySQL乱码问题
o(╯□╰)o我只要一毛钱的鼓励~~