七、MySQL中的字符集

夙愿已清 提交于 2020-04-30 20:52:54

什么是字符集?

计算中的字符文字集合(每个自负文字分配一个对应的数字),将字符集中的文字符号进行编码以便于计算机识别处理。

字符编码就是如何在计算机中存储表示字符集中每个字符文字对应的数字。

发展历程

ASCII与字符集混乱时代

20世纪60年代初,美国标准化组织ANSI发布了第一个字符集 ASCII 后来演变成了国际标准 ISO-646。

ASCII采用7位编码,包含大小写英文字母、阿拉伯数字和标点以及33个控制符号。

之后制定的字符集大部分都兼容ASCII编码。

随后各国、个公司纷纷制定自己的字符集标准,比如:GBK、GB2312-80、ISO-8859系列等。到了20世界80年代,大家都崩溃了。。。这么多字符集很难进行软件国际化,然后大家就想着能不能统一字符编码。

Unicode

为了统一这个字符集,1984年ISO的一些成员国开始发起制定新的国际字符集标准,用来容纳世界各国的语言文字,然后UCS(ISO-10646)诞生了。

但是这个UCS遭到了美国很多计算机公司的反对,1988年联合微软、苹果、IBM、SUN等公司成立Unicode 协会,并于1991年推出Unicode1.0。

然后ISO和Unicode协会为了统一编码标准,1991年10月达成协议,ISO将Unicode编码并入UCS的0组0面中(简称为BMP,UCS编码划分为group、plane、row、cell)。因为是0组0面,所以就不需要存储了,2个字节进行编码就足以,所以就理所当然的叫做UCS-2。

为了能使用BMP以外的文字,Unicode提出了UTF-16的解决方案,将BMP外的文字(包含组面共32位),转为两个16位的Unicode编码。

但是问题又来了,当时的计算机和网络智能处理但字节的数据流,为了让UTF-16更好的兼容,将BMP内外的文字转换成了1-4字节的编码,不同数量字节的编码表示UCS中不同范围的编码。

中文字符集

GB2312-80 于1980年根据ISO/IEC2022提供的字符编码,定义为双字节字符集。

GB13000 于1993年在GB2312-80基础上扩充了大量文字,但并没有受到业界支持。

GBK 于1995年在GB2312-80基础上扩充了大量文字,同时兼容GB2312。同时因为得到微软支持而流行。

GB18030发布于2000年,分为2字节和4字节编码,2字节部分与GBK保持一致。所以GB18030是GBK的超集。

MySQL中的字符集

查看可用字符集

SHOW CHARACTER SET;

结果可以分为字符集和校对规则两部分。

同一个字符集可以对应多个校对规则。

校对规则

_ci 结尾的校对规则对大小写不敏感。

_cs 结尾的校对规则对大小写敏感

_bin 结尾的校对规则只比较原始编码,不比较编码后的值。

字符集设定

MySQL的字符集设定分为4个级别:服务器、数据库、表、字段

服务器级别需要在my.cnf中设置 character-set-server 选项 或者在启动的时候指定。

数据库级别需要在创建的时候通过charset指定。

表级别和字符级别需要在创建表的时候制定字符集和校对规则。

会话字符集

character_set_client 客户端字符集和校对规则

character_set_connection 会话连接字符集和校对规则

character_set_results 返回结果的字符集和校对规则

通常使用 SET NAMES xxx 的方式对三个同时设定

或者在SQL语句中使用 _字符集名称来强制使用指定字符集

SELECT _gbk "我是中国人"

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!