MySql数据库字符集和比较规则

一、编码规范及编码规范里的3个子概念:

编码规范:使用不同的二进制数来表示代表不同的字符

1.字库表(界定字符范围)

一套编码规范不一定包含世界上所有的字符,字库表就存储了编码规范中能显示的所有字符。例如:几乎所有汉字都保存在GBK 编码规范的字库表中,但法语,俄语并不在其字库表中。

2.编码字符集(字符集)

字库表中,每一个字符都有一个对应的二进制地址,编码字符集就是这些地址的集合。
例如:在ASCII码的编码字符集中,字母A的序号(地址)是65,65的二进制就是01000001。我们可以说编码字符集就是用来存储这些二进制数的。而这个二进制数就是编码字符集中的一个元素,同时它也是字库表中字母A的地址。我们根据这个地址就可以显示出字母A。
结论:字符集和字库表一一对应,相互转换。

3.字符编码(编码方式)

知道字库表和编码字符集后,我们就可以直接使用二进制地址来得到字符了。

但直接使用字符对应的二进制地址来显示文字是十分浪费的,Unicode 编码规范中包括了几百万个字符,想要包括几百万个不同的字符,起码需要3个字节的容量,为了方便将来扩展,Unicode还保留了更多未使用的空间,最多可以存储4个字节的容量。

因此为了区分每个字符,哪怕是00000000 00000000 00000000 00001111这种其实只占了1个字节的字符,我们也要为他分配4个字节的空间,这就导致一个可以用1G保存的文件,现在需要4G才能保存,这是极其浪费的做法。

于是制定了一套算法来节省空间,而每种不同的算法都被称作一种编码方式.

变长编码方式:使用不同的字节数表示一个字符,例如:gb2312、utf-8、utf-16
定长编码方式:使用相同的字节数表示一个字符,例如:ascii、utf-32.

例如:UTF-8就是一种编码方式,Unicode是一种编码规范。此外,Unicode还有UTF-16,UTF-32这两种编码方式。不同的编码方式节约的空间不同。UTF-8 表示最少使用1个字节,UTF-16表示最少使用2个字节,UTF-32是定长编码方式,固定使用4个字节

二、比较规则

如何比较两个字符大小,比较简单的场景根据字符直接进行比较,在很多场合下,英文不区分大小写,就需要先统一转换为大写或小写,再进行比较。还有一些语言根据是否重音比较大小。故每一种字符集都对应多种比较规则;
例如:utf-8的比较规则:uft8_general_ci、utf_bin、uft8_unicode_ci等。
比较规则的命名的一般规律:
1,以其关联字符集开头。例如:uft8_xxx_xxx
2,后面紧跟该比较规则所应用的语言。uft8_polish_ci表示波兰语的比较规则
3,后缀表示是否区分语言中的重音、大小写等。例如:_ai 不区分重音、_as区分重音、_ci 不区分大小写、_cs 区分大小写、_bin已二进制方式比较

三、MySql四个级别字符集和比较规则

四个级别的字符集和比较规则设置:服务器、数据库、表、列
1,如果创建和修改列时,没有显示的指定字符集和比较规则,则默认使用表的字符集和比较规则
2,如果创建表时,没有显示的指定字符集和比较规则,则默认使用数据库的字符集和比较规则
3,如果创建数据时,没有显示的指定字符集和比较规则,则默认使用服务器的字符集和比较规则

mysql中每个字符集都对应一些比较规则,并指定其中一个是默认的比较规则,每个比较规则只对应一个字符集;
若只修改字符集,则比较规则会跟着设置为该字符集默认的比较规则
若只修改比较规则,则字节集会跟着设置为该比较规则对应的字符集

四、MySql客户端和服务端通讯过程中使用字符集

编码:将字符转换为二进制地址
解码:将二进制地址转换为字符
字符集的转换:使用A字符集解码,得到字符,再将字符使用B字符集编码

1,客户端发送请求字节时,使用操作系统当前的使用的字符集;windows系统可以通过,启动参数default-character-set设置
LC_ALL、LC_CTYPE、LANG这三个环境变量决定了当前操作系统时哪种字符集,其中优先级LC_ALL>LC_CTYPE>LANG
2,服务器接收到请求后,使用哪种字符集进行解码取决于,当前session的系统变量 character_set_client
3,服务器运行过程中,会把字符集转换为哪种字符集,取决于当前session的系统变量 character_set_connection;并非多次一举select ‘a’ == ‘A’ 并不能确定结果,需要考虑字符集及其比较规则;
在执行select * from table1 where c = ‘我’ 时,若character_set_connection的字符集与列c的字符集不一致,则c的优先级高,‘我’需要在转码为列c的字符集,再进行比较
4,服务器在向客户端返回字节时,使用哪种字符集,取决于当前session的系统变量character_set_results
5,客户端接收到返回时,使用操作系统当前的使用的字符集;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值