Please enable Javascript to view the contents

MySQL编码问题

 ·  ☕ 3 分钟
    🏷️

中文乱码

出现乱码的原因:

client <-> server <-> 数据库文件

  • Server 端使用的字符集
  • client 客户端使用的字符集 (传递给客户端)
  • database / table 使用的字符集

只要上面 3 个部分有一个使用了不支持中文的字符集就会出现乱码,注意这里并需要 3 个部位的编码都同时相同,因为它会自动进行转码,但是如果出现了不支持中文的字符集,那么就会 转码失败,从而出现乱码问题

比如;下面的显示结果中 Server 端的编码是指支持西欧语言的 latin1 字符集,当其与中文转码是就会失败,从而出现乱码。
另外: MySQL8 中默认字符集已经由 latin1 变为 utf8mb4。

查看编码

SHOW VARIABLES LIKE 'character%';

输出结果:

VARIABLE_NAME            | VARIABLE_VALUE
-------------------------+---------------------------------
character_set_client     | utf8
character_set_connection | utf8
character_set_database   | utf8
character_set_filesystem | binary
character_set_results    | utf8
character_set_server     | latin1
character_set_system     | utf8
character_sets_dir       | /usr/local/mysql/share/charsets/

对应变量解释:

VARIABLE_NAME VARIABLE_VALUE 描述
character_set_client utf8 客户端编码设置
character_set_connection utf8 客户端与服务器连接编码设置
character_set_database utf8 当前所在的数据库字符集。如果在创建创建数据库时没有明确指定,则它和 character_set_server 一致(居然不和 character_set_database 相同)。
character_set_filesystem binary 把 os 上文件名转化成此字符集,即把 character_set_client 转换 character_set_filesystem,默认 binary 是不做任何转换的
character_set_results utf8 响应给客户端数据的编码设置
character_set_server utf8 服务器端编码设置
character_set_system utf8 character_set_system 是个只读数据不能更改。

字符集选择

MySQL8 中默认字符集已经由 latin1 变为 utf8mb4;出现乱码的概率也会大大减少。

这里建议 服务器端数据库中 都使用 utf8mb4,当然其它支持中文的字符集也行,比如 utf8 。

MySQL中的 UTF-8 字符集:

  • utf8mb4:Unicode字符集的UTF-8编码,每个字符使用一到四个字节。
  • utf8mb3:Unicode字符集的UTF-8编码,每个字符使用一到三个字节。并不支持存储 emoji 等特殊字符。
  • utf8:目前是 utf8mb3 的别名;但在未来(某天)会将 utf8 作为 utf8mb4 的别名。建议明确使用utf8mb4。

由于乱码基本出现在 MySQL8 以下的版本。这里究竟是选择 utf8mb4 还是 utf8 需要根据实际情况。比如当你的程序、SQL脚本中使用的都是 utf8 ,如果你不想太麻烦可以直接使用 utf8 。

设置服务器端编码

更改 my.cnf 文件。将该文件的 [mysqld]下的character_set_server=latin1 改为 utf8。

更改 database 数据库的编码

对于数据库 ,我们可以在创建数据库时就为其指定默认的编码:

1
create database test default CHARSET 'utf8' COLLATE 'utf8_general_ci';

也可以尝试更改现有数据库的编码:

1
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

也可对表进行上面的操作

设置连接客户端时使用的编码

character_set_clientcharacter_set_connectioncharacter_set_results 这 3 个参数值是由 客户端 每次连接进来设置的,和服务器端没关系,但是可以在服务器端的配置文件(my.cnf)中设置默认值。

在客户端执行下面的语句,为当前会话同时更改上面的三个值:

1
set names utf8;

但是这样设置的值是临时的;可以在服务器的配置文件中为客户端设置默认值。

在服务器端为客户端设置默认值,更改配置文件中的 [mysql]下的default-character_set为 utf8。

如果客户端是 cmd ,我们也可以将于客户端相关的值设置为 GBK 编码,配置方式与配置成 utf8 一致。

注意 :客户端编辑器的字符编码问题不在该范围,比如服务器传递给客户端编辑器的编码与编辑器的编码不一致导致编辑器自身显示乱码,编辑器使用的字体不支持中文显示导致的乱码问题。

If you are using cmd, type chcp 65001 before using pandoc, to set the encoding to UTF-8.

MySQL Documentation

其它相关问题

MySQL8忽略大小写

MySQL 8.0:字符集从 utf8 转换成 utf8mb4

您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录