MySQL 具备显著的字符集灵活性,区别于 Oracle 等多数数据库管理系统通常仅支持统一字符集的限制,其可在同一服务器数据库、甚至同一张的不同字段中配置不同字符集。同时,MySQL 的字符集与校对规则支持服务器、数据库、表、字段四个层级的默认设置,各层级设置位置不同,分别作用于对应范围的字符存储与比较逻辑。

如何查看服务器字符集和校对规则:

输入:

SHOW VARIABLES LIKE 'character_set_server' ;

 MySQL 服务器的字符集

输入:

SHOW VARIABLES LIKE 'collation_server' ;

 MySQL 服务器的校对规则


如何修改服务器字符集和校对规则:

记载配置文件my.ini中进行设置:


[mysqld]
character-set-server='字符集'

或是连接MySQL服务器时设置字符集:

mysql --default-character-set=字符集名称 -h --- IP --- -u --- -p ---

其中'---'对应服务器的各个参数

MySQL 字符集与校对规则的默认机制如下:未指定服务器字符集时,默认采用 latin1;仅指定字符集而未指定校对规则时,自动使用该字符集的默认校对规则;若需使用非默认校对规则,需在指定字符集时一并指定。


如何查看数据库字符集和校对规则:

数据库的字符集和校对规则既能在创建之初指定,也能再创建之后修改,具体参考《MySQL修改数据库》

若数据表或字段已存在数据,仅修改表级或字段级的字符集设置,已有数据也不会自动按新字符集重新编码存储。这意味着单纯调整字符集配置无法改变存量数据的实际编码格式,需通过额外的数据导出、转换编码、重新导入等操作,才能实现存量数据的字符集更新。具体如何修可跳转至???。

通常情况下,设置数据库字符集有以下四大规则:

同时指定字符集和校对规则使用指定的字符集使用指定的校对规则
仅指定字符集使用指定的字符集使用该字符集的默认校对规则
仅指定校对规则使用与该校对规则关联的字符集使用指定的校对规则
均未指定使用服务器字符集使用服务器校对规则

通常在创建数据库时就会指定字符集和校对规则:

不知道自己数据库默认是什么字符集和校对规则,可输入:

SHOW VARIABLES LIKE 'character_set_database' ;      -- 查看当前数据库使用的字符集 
SHOW VARIABLES LIKE 'collation_database';         -- 查看当前数据库使用的校对规则


如何查看表字符集和校对规则:

既可在表创建时指定,又能在创建后通过ALTER TABLE进行修改,具体参考《MySQL修改数据表》

通常情况下,设置表字符集有以下四大规则(与数据库类似):

同时指定字符集和校对规则使用指定的字符集使用指定的校对规则
仅指定字符集使用指定的字符集使用该字符集的默认校对规则
仅指定校对规则使用与该校对规则关联的字符集使用指定的校对规则
均未指定使用数据库字符集使用数据库校对规则

不知道自己表默认是什么字符集和校对规则,可输入:

SHOW CREATE TABLE dotcpp.dotcpp_user \G

表字符集和校对规则

由表可知,dotcpp_user表的默认字符集为 utf8mb4,默认校对规则为 utf8mb4_0900_ai_ci。


如何查看列字符集和校对规则:

MySQL可以查改列级别的字符集和校对规则,应用于不同字段的个性化字符集需求(不过这种情况是比较少见的):

同理,列的字符集和校对规则既可在创建列时指定,又能在创建后通过

ALTER TABLE 表名 MODIFY 列名 数据类型 CHARACTER SET 字符集名;

比如修改并查看dotcpp_user表中hobby列的字符集:


ALTER TABLE dotcpp_user MODIFY hobby VARCHAR(50) CHARACTER SET gbk;
SHOW CREATE TABLE dotcpp_user \G

得到:

dotcpp_user表对hobby字段进行gbk字符集修改并

可以看到,hobby字段已经单独修改成bgk字符集。


连接字符集和校对规则:

上面提到的 4 种设置方式,均用于确定数据存储层面的字符集与校对规则。而在实际应用中,还需配置客户端与服务器间交互过程的字符集及校对规则

MySQL 为该交互场景提供 3 个核心参数,分别是:

1.character_set_client:客户端发送数据的字符集;

2.character_set_connection:服务器接收客户端数据后使用的字符集;

3.character_set_results:服务器返回结果给客户端的字符集。

为保证数据传输准确,通常需将这三个参数设置为相同的字符集。


下面提供三种方式对对客户端和服务器连接的字符集和校对规则进行:

1,在my.ini配置文件中设置(长期配置):

[mysqll]
default-character-set=gbk

重启MySQL服务器后即可生效。

2. 修改提到的3个核心参数(character_set_client、 character_set_connection 和 character_set_results)

SET NAMES gbk;   -- NAMES等价于设置这三个参数了,不过这个只能临时进行修改

3.通过MySQL对当前对话框字符集和校对规则的临时修改:

set character_set_client = gbk; -- 客户端发送数据的字符集
set character_set_connection = gbk; set character_set_database = gbk; set character_set_results = gbk; -- 连接层处理/当前库默认/返回结果的字符集
set character_set_server = gbk; -- 服务器级默认字符集
set collation_connection = gbk_chinese_ci; set collation_database = gbk_chinese_ci; set collation_server = gbk_chinese_ci; -- 对应层级的gbk校对规则


点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)