mysql8.0字符集排序规则_MySQL的字符集与排序规则
今天突然被同事问到,MySql ⾥的 uft8 与 utf8mb4 究竟有什么区别,当时我也是⼀脸问号,因此特地去了解了⼀下。
字符集
uft8 与 utf8mb4 其实指的是 MySQL 中的字符集,那到底什么是字符集呢?
概念
很多⼈常常会把字符、字符集、字符编码的概念混为⼀谈,今天我们仔细来看看。
何为字符?
字符(Charcter)是⽂字与符号的总称,包括⽂字、图形符号、数学符号等。26个英⽂字母属于字符,每个汉字也属于⼀个字符。
那么什么叫字符集?
字符集是⼀组抽象的字符(Charcter)组合的集合。举⼀个例⼦,所有的汉字就算⼀个“字符集合”,所有的英
语字母也算⼀个“字符集合”。注意,我这⾥说它们是字符集合,⽽且还有双引号。是因为字符集并不简单的是字符的集合,准确概述来说,字符集是⼀套符号和编码的规则。字符集需要以某种字符编码⽅式来表⽰、存储字符。我们知道,计算机内部,所有信息最终都是⼀个⼆进制值。每⼀个⼆进制位(bit)有0和1两种状态。⽽如果⽤不同的0和1组合表⽰不同的字符就是编码。
那什么叫字符编码呢?
字符最终是以⼆进制形式存储在磁盘的,这也是为什么要有字符编码的原因,因为计算机最终都要以⼆进制形式存储,那么编码规则就是⽤什么样的⼆进制来代表这个字符。例如,我们所熟知的ASCII码表中,01000011这个⼆进制对应的⼗进制是67,它代表的就是英语字母C。准确概述来说,字符编码⽅式是⽤⼀个或多个字节的⼆进制形式表⽰字符集中的⼀个字符。每种字符集都有⾃⼰特有的编码⽅式,因此同⼀个字符,在不同字符集的编码⽅式下,可能会产⽣不同的⼆进制形式。
既然我们经知道了 utf8 与 utf8mb4 都是⼀种字符集,那两种到底有什么区别呢?
utf8
MySQL 在创⽴时使⽤的字符集就是 utf8。⾸先它能存储下⼤部分的中⽂汉字,对于我们正常使⽤肯定是绰绰有余的。
unicode所有字符
它由三个字节组成,能组成的最⼤ Unicode 字符是0xffff,也就是 Unicode 中的基本多⽂种平⾯(BMP)。
也就是说,任何不在基本多⽂本平⾯的 Unicode 字符,都⽆法使⽤ MySQL 的 utf8 字符集存储。
utf8mb4
MySQL 在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门⽤来兼容四字节的 Unicode。
新增的⼀个字节,可以让它⽀持包括 Emoji 表情(Emoji 是⼀种特殊的 Unicode 编码,常见于 ios 和 android ⼿机上),和很多不常⽤的汉字,以及任何新增的 Unicode 字符等等。
使⽤
我觉得,为了获取更好的兼容性,应该总是使⽤ utf8mb4 ⽽⾮ utf8。
对于 CHAR 类型数据,utf8mb4 会多消耗⼀些空间,根据 MySQL 官⽅建议,可以使⽤ VARCHAR 替代 CHAR。
排序规则
创建库的时候,我们经常会使⽤语句:
CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
既然我们知道了CHARSET是代表字符集,那么COLLATE⼜代表什么呢?它代表着排序规则。
概念
MySQl的排序规则(collation),⼀般指对字符集中字符串之间的⽐较、排序制定的规则, MySLQ排序规则特征:
o 两个不同的字符集不能有相同的校对规则;
o 每个字符集有⼀个默认校对规则;
o 存在校对规则命名约定:以其相关的字符集名开始,中间包括⼀个语⾔名,并且以_ci(⼤⼩写不敏感)、_cs(⼤⼩写敏感)或_bin(⼆元)结束。
其实对于排序规则的细节问题,我们关注较少,反⽽对排序规则中是否涉及⼤⼩写敏感关注较多。
例如,系统使⽤ utf8 字符集,若使⽤ utf8_bin 排序规则,执⾏ SQL 查询时区分⼤⼩写。使⽤ utf8_gen
eral_ci 不区分⼤⼩写(默认的 utf8 字符集对应的校对规则是 utf8_general_ci)。
utf8_unicode_ci 与 utf8_general_ci 的区别
当前,utf8_unicode_ci 校对规则仅部分⽀持 Unicode 校对规则算法。⼀些字符还是不能⽀持。并且,不能完全⽀持组合的记号。这主要影响越南和俄罗斯的⼀些少数民族语⾔,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci 的最主要的特⾊是⽀持扩展,即当把⼀个字母看作与其它字母组合相等时。例如,在德语和⼀些其它语⾔中‘ß’等于‘ss’。utf8_general_ci 是⼀个遗留的校对规则,不⽀持扩展。它仅能够在字符之间进⾏逐个⽐较。这意味着 utf8_general_ci 校对规则进⾏的⽐较速度很快,但是与使⽤ utf8_unicode_ci 的校对规则相⽐,⽐较正确性较差)。
使⽤
对于⼀种语⾔仅当使⽤ utf8_unicode_ci 排序做的不好时,才执⾏与具体语⾔相关的utf8字符集校对规则。例如,对于德语和法
语,utf8_unicode_ci ⼯作的很好,因此不再需要为这两种语⾔创建特殊的 utf8 校对规则。
utf8_general_ci 也适⽤与德语和法语,除了‘ß’等于‘s’,⽽不是‘ss’之外。如果你的应⽤能够接受这些,那么应该使⽤ utf8_general_ci,因为它速度快。否则,使⽤ utf8_unicode_ci,因为它⽐较准确。
总结
想不到 DB 创建语句中的CHARSET 与 COLLATE 都有这么⼤的学问,码农的学习之路真的是⼀刻都不能停⽌。
有兴趣的话可以访问我的博客或者关注我的、头条号,说不定会有意外的惊喜。
————————————————
版权声明:本⽂为CSDN博主「古⽉懿轩」的原创⽂章,遵循CC 4.0 BY-SA版权协议,转载请附上原⽂出处链接及本声明。
原⽂链接:blog.csdn/weixin_32771631/article/details/114341161
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论