3.3 【MySQL】字符集和比较规则的应用

3.3.1 各级别的字符集和比较规则

MySQL 有4个级别的字符集和比较规则,分别是:

服务器级别

数据库级别

表级别

列级别

3.3.1.1 服务器级别

MySQL 提供了两个系统变量来表示服务器级别的字符集和比较规则:

|----------------------|------------|
| 系统变量 | 描述 |
| character_set_server | 服务器级别的字符集 |
| collation_server | 服务器级别的比较规则 |

我们看一下这两个系统变量的值:

可以看到在我的计算机中服务器级别默认的字符集是 utf8 ,默认的比较规则是 utf8_general_ci 。

我们可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用 SET 语句修改这两个变量的值。比如我们可以在配置文件中这样写:

sql 复制代码
[server]
character_set_server=gbk
collation_server=gbk_chinese_ci

当服务器启动的时候读取这个配置文件后这两个系统变量的值便修改了。

3.3.1.2 数据库级别

我们在创建和修改数据库的时候可以指定该数据库的字符集和比较规则,具体语法如下:

sql 复制代码
CREATE DATABASE 数据库名 
[[DEFAULT] CHARACTER SET 字符集名称] 
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名 
[[DEFAULT] CHARACTER SET 字符集名称] 
[[DEFAULT] COLLATE 比较规则名称];

如果想查看当前数据库使用的字符集和比较规则,可以查看下面两个系统变量的值(前提是使用 USE 语句选择当前默认数据库,如果没有默认数据库,则变量与相应的服务器级系统变量具有相同的值):

|------------------------|------------|
| 系统变量 | 描述 |
| character_set_database | 当前数据库的字符集 |
| collation_database | 当前数据库的比较规则 |

我们来查看一下刚刚创建的 charset_demo_db 数据库的字符集和比较规则:

可以看到这个 charset_demo_db 数据库的字符集和比较规则就是我们在创建语句中指定的。需要注意的一点是:character_set_database 和 collation_database 这两个系统变量是只读的,我们不能通过修改这两个变量的值而改变当前数据库的字符集和比较规则。

数据库的创建语句中也可以不指定字符集和比较规则,比如这样:

sql 复制代码
CREATE DATABASE 数据库名;

这样的话将使用服务器级别的字符集和比较规则作为数据库的字符集和比较规则。

3.3.1.3 表级别

我们也可以在创建和修改表的时候指定表的字符集和比较规则,语法如下:

sql 复制代码
CREATE TABLE 表名 (列的信息) 
[[DEFAULT] CHARACTER SET 字符集名称] 
[COLLATE 比较规则名称]]

ALTER TABLE 表名 
[[DEFAULT] CHARACTER SET 字符集名称] 
[COLLATE 比较规则名称]

3.3.1.4 列级别

需要注意的是,对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。我们在创建和修改列定义的时候可以指定该列的字符集和比较规则,语法如下:

sql 复制代码
CREATE TABLE 表名( 
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称], 
其他列...);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

3.3.1.5 仅修改字符集或仅修改比较规则

由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化,具体规则如下:

只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。

只修改比较规则,则字符集将变为修改后的比较规则对应的字符集。

不论哪个级别的字符集和比较规则,这两条规则都适用,我们以服务器级别的字符集和比较规则为例来看一下详细过程:

只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。

我们只修改了 character_set_server 的值为 gb2312 , collation_server 的值自动变为了gb2312_chinese_ci 。

只修改比较规则,则字符集将变为修改后的比较规则对应的字符集。

我们只修改了 collation_server 的值为 utf8_general_ci , character_set_server 的值自动变为了utf8 。

3.3.1.6 各级别字符集和比较规则小结

如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则

如果创建或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则

如果创建或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则

相关推荐
jiayou6412 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE1 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
唐青枫3 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
小满8783 天前
5.Mysql事务隔离级别与锁机制
mysql
笃行3503 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3503 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3503 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
元Y亨H3 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql