一、概述

服务器默认字符集,是整个 MySQL 实例的默认字符集与排序规则。
创建数据库时,如果你没指定字符集,数据库会继承服务器的默认值。当创建表时,如果表没指定字符集,也会继承数据库的字符集(而数据库默认值又来自服务器)。

数据库字符集,是该数据库中新建对象(表、存储过程等)的默认字符集与排序规则。
当你在该数据库中新建表,如果没指定字符集,表会使用数据库的默认字符集。
表可以指定自己的字符集,与数据库字符集不同。

继承关系:
服务器字符集 → 数据库字符集 → 表字符集 → 列字符集
每一层都可以覆盖上一级的默认值。

二、服务器

2.1 设置服务器字符集

服务器相关的设置,放在[mysqld]块中。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'

#强制客户端使用服务器的字符集,避免客户端误报 latin1(某些工具不兼容)
character-set-client-handshake = FALSE

关于init_connect = 'SET NAMES utf8mb4'

#每次客户端连接数据库时执行这条 SQL 语句。
#等价于 SET character_set_connection = utf8mb4, character_set_client = utf8mb4, character_set_results = utf8mb4;
#确保客户端和服务器端使用统一的字符集进行通信。
#init_connect 对 root 用户无效,只对普通用户连接时有效。

2.2 检验服务器字符集

#查看服务器默认字符集
SHOW VARIABLES LIKE 'character_set_server';

#查看所有字符集相关参数(模糊查询)
SHOW VARIABLES LIKE 'character_set_%';

#查看默认排序规则
SHOW VARIABLES LIKE 'collation_server';

2.3 服务器字符集变量

变量名称含义解释
character_set_clientutf8mb4客户端发送到服务器的字符编码(客户端数据编码方式)。
character_set_connectionutf8mb4服务器在解析 SQL 语句时使用的字符编码(连接层的编码)。
character_set_databaseutf8mb4当前选中数据库的默认字符集,用于新建表时的默认值。
character_set_filesystembinary文件名(如 LOAD DATA)使用的字符集,通常设为 binary 防止字符集转换。
character_set_resultsutf8mb4服务器返回给客户端的查询结果的字符集。
character_set_serverutf8mb4服务器的默认字符集,用于创建新数据库时的默认值。
character_set_systemutf8mb3系统元数据使用的字符集(如 information_schema 中的内容),MySQL 固定为 utf8mb3。
character_sets_dir/usr/share/mysql-8.0/charsets/字符集定义文件所在的目录路径。

重点关注:
character_set_client → 客户端发送数据使用的字符集
character_set_connection → 服务器解析语句时使用的字符集
character_set_results → 服务器发送结果时使用的字符集

三、数据库

3.1 设置数据库字符集

数据库字符集在创建库时指定,如果没有指定,则会使用服务器默认字符集。

CREATE DATABASE mydb01
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_general_ci;

3.2 检验数据库的字符集

方法1:

SHOW CREATE DATABASE mydb01;

方法2:(更精确)

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'mydb01';

3.3 修改数据库字符集

一个已经创建的库修改字符集

ALTER DATABASE mydb
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_general_ci;

这个命令不会修改已有表/列的字符集,只会影响以后新建表的默认值。

如果你要统一修改指定表和字段的字符集,则执行表的转换头命令:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

四、客户端

4.1 设置客户端默认字符集

所有使用 mysql 客户端库的程序(如命令行客户端、Python 的 MySQL 库等)。

[client]
default-character-set = utf8mb4

4.2 设置mysql命令行默认字符集

仅影响 mysql 命令行工具。
当你在终端使用 mysql 命令登录数据库时,默认使用 utf8mb4 字符集。

[mysql]
default-character-set = utf8mb4

4.3 mysql命令行工具配置文件

默认配置文件读取顺序:

/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

通过mysql命令查询

mysql --help --verbose


在输出中,会看到类似下面的一段内容:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

这段列出了 实际会被读取的配置文件路径和顺序。
如果某个文件不存在,它就会被跳过;存在就会被读取。

强制指定配置文件

mysql --defaults-file=/etc/mysql/my.cnf -u root -p

4.4 服务器与客户端字符集不一致

将会导致以下问题:

  • 连接建立成功,但字符集协商其实存在差异。
  • 插入数据时乱码、读取数据时乱码
  • 插入、查询都不会报错。
  • 将乱码写入数据库

五、使用命令设置字符集(临时)

设置本次会话字符集

SET NAMES utf8mb4;

#次命令等价于
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

设置服务器字符集

SET GLOBAL character_set_server = 'utf8mb4';
SET GLOBAL collation_server = 'utf8mb4_general_ci';

SET GLOBAL 设置的是新连接的默认值,当前连接不会受到影响。

验证是否生效

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

标签: none

添加新评论