不同的 utf8mb4 二进制排序规则之间有什么区别?

mvo*_*sek 5 mysql collation utf-8

utf8mb4_0900_bin二进制排序规则与二进制排序规则有什么区别utf8mb4_bin

Sol*_*zky 7

据我所知,存在三个差异(根据他们的文档):

  1. 案例映射(针对LOWER()/UPPER()功能):

    https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html#charset-unicode-sets-uca

    LOWER() 和 UPPER() 函数根据其参数的排序规则执行大小写折叠。

    在这种情况下,两种排序规则之间的区别在于,该_0900_版本基于较新版本的 Unicode,很可能具有更多映射定义(甚至可能有一些更正)。

  2. 填充与无填充(尾随空格):

    https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html#charset-unicode-sets-pad-attributes

    的 pad 属性为utf8mb4_binis PAD SPACE,而 for utf8mb4_0900_binit is NO PAD。因此,涉及utf8mb4_0900_bin不添加尾随空格的操作,并且涉及带有尾随空格的字符串的比较对于两种排序规则可能有所不同

    本质上,utf8mb4_bin忽略尾随空格,同时utf8mb4_0900_bin不忽略它们。有关示例,请参阅文档(上面链接)。

  3. 排序(仅性能,不排序):

    https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html#charset-unicode-sets-colating-weights

    • 对于_bin除 之外的排序规则utf8mb4_0900_bin,权重基于代码点,可能添加前导零字节。

    • 对于utf8mb4_0900_bin,权重是utf8mb4编码字节。排序顺序与 相同utf8mb4_bin,但速度更快。

    将其翻译成人类的意思是,对于 U+FF9D 这样的代码点,将看到EF BE 9Dutf8mb4_bin的 UTF-8 编码字节序列,并将其转换为00 FF 9D。但是,不会其转换为代码点值。这是因为 UTF-8 字节序列已经是连续的,因此顺序与代码点值的顺序相同。那么为什么要费心这个额外的转换步骤呢?utf8mb4_0900_bin