Login
网站首页 > 文章中心 > 其它

MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则

作者:小编 更新时间:2023-08-17 10:44:08 浏览量:189人看过

字符集和比较规则简介

一些重要的字符集

'L' ->  01001100(十六进制:0x4C,十进制:76)
'M' ->  01001101(十六进制:0x4D,十进制:77)

MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则-图1

字符集的查看

1 SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];

其中的Default collation列表示这种字符集中一种默认的比较规则.大家注意返回结果中的最后一列Maxlen,它代表该种字符集表示一个字符最多需要几个字节.

SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];

MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则-图2

字符集和比较规则的应用

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

数据库级别

表级别

列级别


MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则-图3

我们可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用SET语句修改这两个变量的值.比如我们可以在配置文件中这样写:
1 [server] character_set_server=gbk collation_server=gbk_chinese_ci?
1 CREATE DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称];  
2 ALTER DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称];
3 
4 mysql> CREATE DATABASE charset_demo_db -> CHARACTER SET gb2312 -> COLLATE gb2312_chinese_ci; 
5 Query OK, 1 row affected (0.01 sec)
需要注意的一点是:?character_set_database?和?collation_database?这两个系统变量是只读的,我们不能通过修改这两个变量的值而改变当前数据库的字符集和比较规则.

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

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

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

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

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


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

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

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

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

不论哪个级别的字符集和比较规则,这两条规则都适用

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

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

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

从这个分析中我们可以得出这么几点需要注意的地方:


SET NAMES 字符集名;
SET character_set_client = 字符集名;
SET character_set_connection = 字符集名;
SET character_set_results = 字符集名;

总结

字符集指的是某个字符范围的编码规则.

比较规则是针对某个字符集中的字符比较大小的一种规则.

在MySQL中,一个字符集可以有若干种比较规则,其中有一个默认的比较规则,一个比较规则必须对应一个字符集.

查看MySQL中查看支持的字符集和比较规则的语句如下:

SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
SHOW COLLATION [LIKE 匹配的模式];

MySQL有四个级别的字符集和比较规则

服务器级别

character_set_server表示服务器级别的字符集,collation_server表示服务器级别的比较规则.

 数据库级别

?    创建和修改数据库时可以指定字符集和比较规则


ALTER DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称];

character_set_database表示当前数据库的字符集,collation_database表示当前默认数据库的比较规则,这两个系统变量是只读的,不能修改.如果没有指定当前默认数据库,则变量与相应的服务器级系统变量具有相同的值.
 表级别

创建和修改表的时候指定表的字符集和比较规则

CREATE TABLE 表名 (列的信息) [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]];
ALTER TABLE 表名 [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

创建和修改列定义的时候可以指定该列的字符集和比较规则:

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

从发送请求到接收结果过程中发生的字符集转换:

如果character_set_connection代表的字符集和具体操作的列使用的字符集一致,则直接进行相应操作,否则的话需要将请求中的字符串从character_set_connection代表的字符集转换为具体操作的列使用的字符集之后再进行操作.

在这个过程中各个系统变量的含义如下:

比较规则的作用通常体现比较字符串大小的表达式以及对某个字符串列进行排序中.

以上就是土嘎嘎小编为大家整理的MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章