在mysql数据库中,排序规则是依赖字符集编码的,他们在mysql中经常是捆绑的存在。
排序规则一般指对字符集中字符串之间的比较、排序制定的规则。一种字符集可以对应多种排序规则,但是一种排序规则只能对应指定的一种字符集,两个不同的字符集不能有相同的排序规则
上图中utf8mb4字符集对应多个排序规则。每种字符集都有一个默认的排序规则。比如上图中utf8mb4默认的排序规则就是utf8mb4_general_ci。
排序规则和字符集一样,在实例,schema,表,字段级别都可以设置,优先级如下:
字段>表>schema>实例
也就是说,如果字段上设置了字符集和排序规则,那么就采用字段上的字符集和排序规则,如果没有设置就使用表的,如果表上也没有设置,那就是默认使用schema上的,如果schema上也没有设置,那么就使用实例上的字符集和排序规则。
排序规则前缀是字符集编码,中间是排序规则名称,后缀有特殊意义如下(常用的):
_ci : 不区分大小写, Case-insensitive的缩写
_cs : 区分大小写,Case-sensitive的缩写
_ai : 不区分重音,Accent-insensitive的缩写
_as : 区分重音,Accent-sensitive的缩写
_bin : 二进制
例:utf8mb4_general_ci这个排序规则中,utf8mb4是字符集编码,general是排序规则名称,ci意味着不区分大小写。
**排序规则最重要的影响就是如果多表关联查询时,如果表上关联的字段排序规则不一样,则无法进行关联查询。**会抛出如下错误:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
这个时候,必须要把关联字段的排序规则修改成一样才可以进行联合查询。
第二个影响就是在对两个不同排序规则的字段进行字符串比较或者排序时会产生不同的结果。
所以为了避免上述两种情况,需要在建表,建库时使用正确的字符集编码和排序规则。