资讯专栏INFORMATION COLUMN

MySql(二)——字符集和比较规则

宠来也 / 1933人阅读

摘要:二字符集和比较规则一些重要的字符集共收录个字符,包括空格标点符号数字大小写字母和一些不可见字符。这个字符集也有一个别名收录汉字个,其他文字符号个。

MySql(二)——字符集和比较规则 一些重要的字符集

ASCII

共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码

ISO 8859-1

共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名latin1

GB2312

收录汉字6763个,其他文字符号682个。同时这种字符集又兼容ASCII字符集

如果该字符在ASCII字符集中,则采用1字节编码,否则采用2字节编码

这种表示一个字符需要的字节数可能不同的编码方式称为:变长编码方式

GBK

在收录字符范围上对GB2312字符集作了扩充,编码方式上兼容GB2312

utf8

收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节

utf8只是Unicode字符集的一种编码方案,Unicode字符集可以采用utf8utf16utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个字符,utf32使用4个字节编码一个字符。
MySQL中支持的字符集和排序规则

MySQL中的utf8和utf8mb4

utf8mb3:阉割过的utf8字符集,只使用1~3个字节表示字符

utf8mb4:正宗的utf8字符集,使用1~4个字节表示字符

在MySQL中utf8utf8mb3的别名

字符集的查看
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式]

比较规则的查看
SHOW COLLATION [LIKE 匹配的模式]

后缀 英文释义 描述
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitive 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制方式比较
字符集和比较规则的应用

1. MySQL有4个级别的字符集和比较规则

服务器级别

数据库级别

表级别

列级别

2. 服务器级别

服务器级别的字符集:SHOW VARIABLES LIKE "character_set_server"

服务器级别的比较规则:SHOW VARIABLES LIKE "collation_server"

写入配置文件:

[server]
character_set_server=utf8
collation_server=utf8_general_ci

3. 数据库级别

当前数据库的字符集:SHOW VARIABLES LIKE "character_set_database"

当前数据库的比较规则:SHOW VARIABLES LIKE "collation_database"

创建和修改数据库的时候数据库的字符集和比较规则

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

ALTER DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];
创建数据库不指定字符集和比较规则,则默认使用服务器级别的字符集和比较规则

4. 表级别

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

ALTER TABLE 表名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [COLLATE 比较规则名称]
如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则

5.列级别

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

ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
对于某个列来说,如果在创建和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则作为该列的字符集和比较规则

6.仅修改字符集或仅修改比较规则

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

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

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

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

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

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

客户端和服务器通信中的字符集
从发送请求到返回结果这个过程中伴随着多次字符集的转换,在这个过程中会用到3个系统变量
系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器运行过程中使用的字符集
character_set_results 服务器向客户端返回数据时使用的字符集

服务器认为客户端发送过来的请求是用character_set_client编码的

服务器将把得到的结果集使用character_set_results编码后发送给客户端

character_set_connection只是服务器在处理请求时使用的字符集,它是什么其实没多重要,但是一定要注意,该字符集包含的字符范围一定涵盖请求以及结果集中的字符,要不然会出现无法将请求中的字符编码成character_set_connection字符集或者无法编码结果集中的字符

SET NAMES 字符集名等价于:

SET character_set_client = 字符集名;

SET character_set_connection = 字符集名;

SET character_set_results = 字符集名;

如果想写进配置文件:

[client]
default-character-set=utf8

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31015.html

相关文章

  • 关于MySQL的知识点与面试常见问题都在这里

    摘要:串行最高的隔离级别,完全服从的隔离级别。但是这将严重影响程序的性能。此外,垂直分区可以简化表的结构,易于维护。 我自己总结的Java学习的一些知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java_Guide 书籍推荐 《高性能MySQL : 第3版》 文字教程推荐 MySQL 教程(菜鸟教程...

    newtrek 评论0 收藏0

发表评论

0条评论

宠来也

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<