暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql的字符集编码选择

Ty3306 2022-08-24
538

mysql版本:5.7.37

所有内容都来自于mysql5.7文档,这里只是做个笔记,方便以后自己查看。

mysql中的基础概念:

character set:字符集编码。

collations:与字符集编码对应的一套规则,这套规则规定了字符如何比较算法,从而解决如何排序的问题,例如大小写敏感比较,按照字符的二进制编码比较等。

collation的名字组成及含义: {character set name}_{language-specific}_{collation_suffixes} 其中第一个部分表示的值字符集的名字;第二部分表示的特定语言,表示按照该特定语言的排序规则排序;第三部分表示的后缀,后缀含义如下表。

Suffix Meaning
_ai Accent-insensitive
_as Accent-sensitive
_ci Case-insensitive
_cs Case-sensitive
_bin Binary
另外,collatoin的名字后缀中,_ci暗含了_ai,_cs暗含了_as。例如,latin1_general_ci 表示case-insensitive 和 隐含accent-insensitive。

对于_bin后缀的collations来说,其比较的是字符的编码值,这是比较重要的一点。

collation与character set的关系:

mysql中,collation的值必须与character set对应,每一种character set都有一个默认的collation。

例如

如果指定character set为utf8,那么collation的值就只能是utf8相关的collation,否则报错。

如果指定了character set为utf8而没有指定collation的值,那么就会使用utf8对应的默认的collation----utf8_general_ci。

character set repertoire:字符集所支持的字符。

一个String expression可以指定repertoire属性来表明该String expressions的中包含的字符是属于哪个字符集,该属性是对 Collation Coercibility in Expressions的补充,当 Collation Coercibility in Expressions的优先级相同的时候,就需要查看repertoire属性,然后根据该属性来确定是否能够进行字符串的转换,如果不能就报错;如果能转换,则转换。

在创建字段的时候,通常系统都会默认分配一个字符集给一个字段,或者用户也可以显式的给字段指定一个字符集,然后当用户在字符串表达式中使用该字段的时候,假如用户没有指定repertoire属性,那么系统就会使用创建字段的时候的字符集的值来确定repertoire的值。repertoire是以下两个值之一:ASCII和UNICODE。

ASCII:表明该string expressions包含的字符都是ASCII字符。

UNICODE:表盖string expressions包含的字符是unicode字符。

之所以是这两个值之一的原因在于:

ASCII是其它所有character set的子集,所以它能转换为其它任意的字符集字符。

UNICODE是其它所有character set的超集,所以其它任意字符集字符可以转换为UNICODE字符。

binary character set:该字符集应该是mysql的一个概念,其有一个对应的binary collation,该collation规定了binary strings(例如,binary,varbinary类型)的比较和排序规则。binary strings类型的字段都是属于binary character set,在创建二进制字段的时候,不需要指定character set也不能指定character set(如果指定会报错)。

二进制数据

二进制数据的比较是基于字节的,比对的是字节中内容。例如,一个二进制字段具有5个字节,但是存入的数据只有1个字节,那么剩下4个字节全部自动填0,后续的比较也会把这4个0考虑在内。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论