mysql字符串排序规则_MySQL字符集和排序规则

MySQL在创建数据库是,需要设置数据库的字符集和排序规则,如图所示:
我觉得这里有必要解释下字符集和排序规则这两个概念 。
字符集
说到字符集,需要先提下字符、字符集和字符编码这几个词的含义 。
字符()是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等 。
字符集( set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、字符集、BIG5字符集、 字符集、字符集等 。
字符编码是把字符集中的字符编码为特定的二进制数,以便在计算机中存储 。编码方式一般就是对二维表的横纵坐标进行变换的算法 。一般都比较简单,直接把横纵坐标拼一起就完事了 。后来随着字符集的不断扩大,为了节省存储空间,才出现了各种各样的算法 。
字符集和字符编码一般都是成对出现的,如ASCII、IOS-8859-1、、GBK,都是即表示了字符集又表示了对应的字符编码,以后统称为编码 。比较特殊,后面细说 。
在MySQL中需要注意的utf8和这两种字符集的区别,utf-8编码格式我们经常会碰到,但是这里的utf8却不是指utf-8这种编码格式,那么又为啥会出现这种字符集呢?
据说MySQL一开始没有这个字符集,因为utf8只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节,这就造成UTF-8编码下的一些字符无法保存到数据库中,为了修复这个bug而出现了这种字符集 。
三个字节的UTF-8最大能编码的字符是,也就是中的基本多文平面(BMP) 。也就是说,任何不在基本多文平面的字符,都无法使用MySQL原有的utf8字符集存储 。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji表情(Emoji是一种特殊的编码,常见于ios和手机上),和一些不常用的汉字,以及任何新增的字符等等 。
如果要在MySQL中保存4字节长度的UTF-8字符,就需要使用编码,但是要注意只有5.5.3版本以后的MySQL才支持(查看版本命令:()) 。为了获取更好的兼容性,建议使用而非utf8. 对于CHAR类型数据,会多消耗一些空间,但根据 MySQL官方建议,可以使用替代CHAR 。
扩展:char是一种固定长度的类型,则是一种可变长度的类型(因为char长度固定,方便程序的存储与查找,所以char类型存取速度优于,即以空间换效率)
排序规则
MySQL中常用的排序规则(这里以utf8字符集为例)主要有:、、等 。

mysql字符串排序规则_MySQL字符集和排序规则

文章插图
这里需要注意下ci和cs的区别:
ci的完整英文是'Case ', 即“大小写不敏感”,a和A会在字符判断中会被当做一样的;
cs的完整英文是‘Case ’,即“大小写敏感”,a 和 A 会有区分;
比如下面这个查询:
# 假设数据库中表存在一条数据,其中字段的值为 "A"
* fromwhere= 'a'
-- 如果数据库使用的是排序规则, 下面的查询是可以查询到这条数据
-- 如果数据库使用的是排序规则, 下面的查询是查询不到这条数据
正因为这个性质,导致的查询速度比快,(纯属个人推测,没有实际依据)
: 查询时不区分大小写匹配
: 查询时区分大小写匹配
: 字符串每个字符串用二进制数据编译存储 。区分大小写,而且可以存二进制的内容,与一样,区分大小写
【mysql字符串排序规则_MySQL字符集和排序规则】 : 和一样,不区分大小写
当前校对规则仅部分支持校对规则算法 。一些字符还是不能支持 。并且,不能完全支持组合的记号 。这主要影响越南和俄罗斯的一些少数民族语言,如:、Tatar、和Mari 。