mysql建数据库排序规则选什么 观文一览其正确排序规则

MySQL创建数据库时,需要设置数据库的字符集和排序规则,如图:我觉得这里有必要解释一下字符集和校对的概念。字符集说到字符集,我们需要先提一下字符、字符集和字符编码这几个词

本文最后更新时间:  2023-02-25 10:10:09

MySQL创建数据库时,需要设置数据库的字符集和排序规则,如图:

我觉得这里有必要解释一下字符集和校对的概念。

字符集

说到字符集,我们需要先提一下字符、字符集和字符编码这几个词的含义。

字符(Character)

是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符集(Character set)

是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。

字符编码

是把字符集中的字符编码为特定的二进制数,以便在计算机中存储。编码方式一般就是对二维表的横纵坐标进行变换的算法。一般都比较简单,直接把横纵坐标拼一起就完事了。后来随着字符集的不断扩大,为了节省存储空间,才出现了各种各样的算法。

而字符集和字符码一般是成对出现的,比如ASCII、IOS-8859-1、GB2312和GBK,都是既代表字符集又代表对应的字符码,以后统称为码。Unicode比较特殊,后面会讲到。

在MySQL中,要注意utf8和utf8mb4的区别。我们经常会遇到utf-8编码格式,但是这里的utf8并不是指utf-8编码格式。那么为什么会出现utf8mb4呢?

据说MySQL一开始没有字符集utf8mb4,因为utf8每个字符最多只支持三个字节,而真正的UTF-8每个字符最多四个字节,这就导致UTF-8编码的一些字符无法保存在数据库中。为了修复这个bug,出现了字符集utf8mb4。

UTF-8可以用三个字节编码的最大Unicode字符是0xFFFF,这是Unicode中的基本多文本平面(BMP)。也就是说,任何不在基本多语言平面的Unicode字符都不能使用MySQL的原始utf8字符集存储。有哪些BMP里没有的角色?最常见的有Emoji表情(Emoji是一种特殊的Unicode代码,常见于ios和android手机上)、一些生僻字、任何新的Unicode字符等。

重印

如果要在MySQL中保存长度为4字节的UTF-8字符,需要使用utf8mb4编码,但是注意只有5.5.3版本以后的MySQL支持(查看版本命令:select version())。为了更好的兼容性,建议使用utf8mb4而不是utf8。对于CHAR类型的数据,utf8mb4会多消耗一些空的空间,但是根据MySQL官方推荐,可以用VARCHAR代替CHAR。

扩展:char是定长类型,varchar是变长类型(因为char是定长的,方便程序的存储和查找,所以char的访问速度比varchar好,也就是空)之间的转换效率)

排序规则

MySQL中常用的归类规则(这里以utf8字符集为例)主要有utf8_general_ci、utf8_general_cs、utf8_unicode_ci等。

这里我们需要注意ci和cs的区别:

ci的完整英文是’Case Insensitive’, 即“大小写不敏感”,a和A会在字符判断中会被当做一样的;cs的完整英文是‘Case Sensitive’,即“大小写敏感”,a 和 A 会有区分;

例如,以下查询:

# 假设数据库中SC_Teacher表存在一条数据,其中TeacherName字段的值为 "A"select * from SC_Teacher where TeacherName = 'a' -- 如果数据库使用的是utf8_general_ci排序规则, 下面的查询是可以查询到这条数据-- 如果数据库使用的是utf8_general_cs排序规则, 下面的查询是查询不到这条数据

因为这个性质,utf8_general_ci的查询速度比utf8_general_cs快(纯属个人推测,无实际依据)

utf8_general_ci

: 查询时不区分大小写匹配

utf8_general_cs

: 查询时区分大小写匹配

utf8_bin

: 字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容,与utf8_general_cs一样,区分大小写

utf8_unicode_ci

: 和utf8_general_ci一样,不区分大小写

当前的utf8_general_ci校对规则仅部分支持Unicode校对规则算法。仍不支持某些字符。此外,不能完全支持组合符号。这主要影响越南和俄罗斯的一些少数民族语言,如乌德穆尔特语、鞑靼语、巴什基尔语和马里语。

utf8_general_ci最重要的特点是支持扩展,即当一个字母被认为与其他字母组合相等时。例如,在德语和其他一些语言中,''等于' ss'。

Utf8_general_ci是传统校对规则,不支持扩展。它只能逐个比较字符。这意味着校对规则utf8_general_ci的比对速度较快,但与使用utf8_general_ci的校对规则相比,比对精度较差)。

例如,使用utf8_general_ci和utf8_unicode_ci校对规则,以下比较是相等的:

δ= A = Oü= U

这两种校对规则的区别在于,以下等式适用于utf8_general_ci:

= s

但是,对于utf8_unicode_ci,以下等式成立:

= ss

对于一种语言,只有当utf8_unicode_ci排序没有做好的时候,才执行与特定语言相关的utf8字符集的校对规则。例如,对于德语和法语,utf8_unicode_ci可以很好地工作,因此不再需要为这两种语言创建特殊的utf8校对规则。

Utf8_general_ci也适用于德语和法语,除了''等于' s '而不是' ss '。如果您的应用程序可以接受这些,那么您应该使用utf8_general_ci,因为它速度更快。否则,使用utf8_unicode_ci,因为它更准确。

重印

简要

Utf8_unicode_ci和utf8_general_ci在中文和英文上没有实质性的区别。Utf8_general_ci校对速度很快,但准确性稍差。Utf8_unicode_ci准确率高,但校对速度稍慢。

如果您的应用程序是德语、法语或俄语,请使用utf8_unicode_ci。一般utf8_general_ci就够了,到现在也没发现问题。

温馨提示:内容均由网友自行发布提供,仅用于学习交流,如有版权问题,请联系我们。