MySQL - 数据库字符集
一、概述
服务器默认字符集,是整个 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_client | utf8mb4 | 客户端发送到服务器的字符编码(客户端数据编码方式)。 |
| character_set_connection | utf8mb4 | 服务器在解析 SQL 语句时使用的字符编码(连接层的编码)。 |
| character_set_database | utf8mb4 | 当前选中数据库的默认字符集,用于新建表时的默认值。 |
| character_set_filesystem | binary | 文件名(如 LOAD DATA)使用的字符集,通常设为 binary 防止字符集转换。 |
| character_set_results | utf8mb4 | 服务器返回给客户端的查询结果的字符集。 |
| character_set_server | utf8mb4 | 服务器的默认字符集,用于创建新数据库时的默认值。 |
| character_set_system | utf8mb3 | 系统元数据使用的字符集(如 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 = utf8mb44.2 设置mysql命令行默认字符集
仅影响 mysql 命令行工具。
当你在终端使用 mysql 命令登录数据库时,默认使用 utf8mb4 字符集。
[mysql]
default-character-set = utf8mb44.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 -p4.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%';