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 各级别字符集和比较规则小结

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

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

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

相关推荐
IT摆渡者2 小时前
MySQL性能巡检脚本分析报告
数据库·mysql
Lyyaoo.3 小时前
Redis基础
数据库·redis·缓存
杨云龙UP3 小时前
ODA登录ODA Web管理界面时提示Password Expired的处理方法_20260423
linux·运维·服务器·数据库·oracle
解救女汉子4 小时前
SQL触发器如何获取触发源应用名_利用APP_NAME函数追踪
jvm·数据库·python
weixin_520649875 小时前
数据库函数
数据库
Bert.Cai6 小时前
MySQL LPAD()函数详解
数据库·mysql
OnlyEasyCode7 小时前
Navicat 任务自动备份指定数据库
数据库
if else7 小时前
Redis 哨兵集群部署方案
数据库·redis
yejqvow127 小时前
Pandas 高效实现组内跨行时间戳匹配与布尔标记
jvm·数据库·python
了不起的云计算V7 小时前
从DeepSeek V4适配看国产算力的三个拐点
数据库·人工智能