字符集和排序规则的多级默认系统
MySQL 支持在服务器,数据库,数据表和列分别指定字符集和排序规则。
字符集和排序规则的生效规则:
如果同时指定了字符集和排序规则,则使用指定的字符集和排序规则
如果仅指定了字符集而没有指定排序规则,则使用指定的字符集及字符集的默认排序规则。
如果仅指定了排序规则而没有指定字符集,则使用指定的排序规则及排序规则相对应的字符集。
如果字符集和排序规则均未指定,则使用上级的字符集和排序规则
服务器字符集和排序规则
设置方法一,服务器启动时在命令行的参数中设置:
--character-set-server=charset_name
设置字符集--collation-server=collation_name
设置排序规则
设置方法二,配置文件的 [mysqld]
下设置:
character-set-server=charset_name
设置字符集collation-server=collation_name
设置排序规则
MySQL8 起,MySQL 使用 utf8mb4
作为服务器的默认字符集,utf8mb4_0900_ai_ci
作为服务器的默认排序规则,因此以下三种方式结果相同:
mysqld
mysqld --character-set-server=utf8mb4
mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci
数据库字符集和排序规则
在 CREATE DATABASE
和 ALTER DATABASE
语句中设置。详见MySQL——数据定义语言DDL管理数据库、数据表和索引
数据表字符集和排序规则
在 CREATE TABLE
和 ALTER TABLE
语句中设置。MySQL——数据定义语言DDL管理数据库、数据表和索引
字段字符集和排序规则
在 CREATE TABLE
和 ALTER TABLE
语句中设置。MySQL——数据定义语言DDL管理数据库、数据表和索引
与字符集相关的系统变量值
character_set_client
客户端发送语句使用的字符集。
设置此变量的会话值:向服务器发送语句
SET character_set_client = charset_name;
如果客户端设置的值未知或不可用,或者服务器配置为忽略客户端的设置值,则使用此变量的全局值设置会话值。
character_set_connection
该字符集用于不带字符集介绍符的指定文字,以及用于数字到字符串的转换。
字符串介绍符的用法:
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
设置此变量的会话值:向服务器发送语句
SET character_set_connection = charset_name;
character_set_results
用于将查询结果返回给客户端的字符集。这包括结果数据(例如列值),结果元数据(例如列名)和错误消息。
设置此变量的会话值:向服务器发送语句
SET character_set_results = charset_name;
设置以上三个变量的全局值:在配置文件的
[client]
下设置:default-character-set=charset_name
语句
SET NAMES 'charset_name'
等同于以下三条语句:SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;
语句
SET CHARACTER SET 'charset_name'
等同于以下三条语句:SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = @@character_set_database;
设置
character_set_connection
的同时,也会设置collation_connection
为指定字符集的默认排序规则character_set_server
服务器字符集,设置方法见上文。
character_set_database
当前选中的数据库的字符集,每当使用
use db_name
更改数据库时,服务器都会设置此变量,没有选中时,与 character_set_server 的值相同。此变量已弃用并将在MySQL的未来版本中删除
character_set_system
服务器用于存储标识符的字符集。该值始终为utf8。
character_set_filesystem
文件系统字符集。
character_sets_dir
这个变量是字符集安装的目录。
MySQL中的字符集转换过程
MySQL Server 收到请求时将请求数据从
character_set_client
转换为character_set_connection
;进行内部操作前将请求数据从
character_set_connection
转换为内部操作字符集,其确定方法如下:- 使用每个数据字段的
CHARACTER SET
的设定值; - 若上述值不存在,则使用对应数据表的
DEFAULT CHARACTER SET
的设定值; - 若上述值不存在,则使用对应数据库的
DEFAULT CHARACTER SET
的设定值; - 若上述值不存在,则使用参数
character_set_server
的设定值。
- 使用每个数据字段的
将操作结果发送回客户端之前将字符集转换为
character_set_results
。