字符集
计算机存储的是二进制数据,所以就需要建立一种规则表示二进制数据和字符之间的映射关系。这种规则就叫做字符集
。
比较规则
比较规则是建立在字符集的基础上的,用来比较两个字符的大小。
常用字符集
ASCII码
共128个字符,包括空格、标点符号、数字、大小写字母和一些看不到的字符。
使用一个字节进行编码。例:
'M' -> 0100 1101 (十六进制:0x4D,十进制:77)
'S' -> 0101 0011 (十六进制:0x53,十进制:83)
ISO 8859-1
共256字符,在ASCII
基础上扩充了128个西欧常用字符。别名latin1
使用一个字符编码。
GB2312
收录了多种语言字体,其中包括汉字6763个。同时兼容了ASCII
,所以在编码格式上有点奇怪。
- 如果字符在
ASCII
字符集中,使用1字节编码 - 否则使用2字节
GBK
GB2312
的扩充,编码方式兼容GB2312
。
UTF8
收录了地球上所有已知的字符,还在不断扩充。
兼容ASCII
,采用变长编码方式,每个字符使用1-4个字节。
MySql中的UTF8
因为utf8
包含了太多内容,常用的字符使用1-3个字符就足够表示了。而且MySql
中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以MySql
对utf8
定义了两个概念:
-
utf8mb3
:阉割版utf8
,使用1-3个字符,mysql
中默认的utf8
就是指的这个 -
utf8mb4
:正版utf8
,使用1-4个字符
MySql
中的字符集转换
从客户端发送往服务器的请求本质就是一个字符串,服务器响应也是传递一个字符串。而字符串又是某种字符集的编码格式。所以在这个传输的过程中,就会出现多次字符集的转换,对mysql
而言,这个过程会用到三个系统变量设置的字符集。
常量 | 描述 |
---|---|
character_set_client |
服务器解码请求时使用的字符集 |
character_set_connection |
服务器运行过程中使用的字符集 |
character_set_results |
服务器向客户端返回数据时使用的字符集 |
请求从发送到结果返回的字符集变化
-
客户端发送请求
客户端采用的字符集与操作系统的字符集保持一致。
-
服务器接受客户端请求
服务器会把接收到的请求认为是
character_set_client
字符集,把请求字符串按照该规则转码,对转码后的结果进行操作。 -
服务端返回操作结果给客户端
服务器将把得到的结果集使用
character_set_results
编码后发送给客户端。
可以在配置文件里写
[client]
default-character-set=utf8
这样可以做到在启动客户端的时候将上面这三个常量都设置成UTF8
MySql
的比较规则
命名规律
-
比较规则名称以与其关联的字符集的名称开头。如上图的查询结果的比较规则名称都是以
utf8
开头的。 -
后边紧跟着该比较规则主要作用于哪种语言,比如
utf8_polish_ci
表示以波兰语的规则比较,utf8_spanish_ci
是以西班牙语的规则比较,utf8_general_ci
是一种通用的比较规则。 -
名称后缀意味着该比较规则是否区分语言中的重音、大小写啥的,具体可以用的值如下:
后缀 英文释义 描述 _ai
accent insensitive
不区分重音 _as
accent sensitive
区分重音 _ci
case insensitive
不区分大小写 _cs
case sensitive
区分大小写 _bin
binary
以二进制方式比较
MySql
字符集和比较规则的四种级别
-
服务器级别
character_set_server
字符集collation_server
比较规则 -
数据库级别
character_set_database
字符集collation_database
比较规则 -
表级别
-
列级别
查看MySql
字符集
show variables like 'collation_%';
show variables like 'char%';
网友评论