Mysql

不同的 utf8mb4 二進制排序規則有什麼區別?

  • October 14, 2020

utf8mb4_0900_binutf8mb4_bin二進制排序規則有什麼區別?

據我所知,存在三個差異(根據他們的文件):

  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_binPAD SPACE,而 for utf8mb4_0900_binit 是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-collating-weights

* 對於_bin除 之外的排序utf8mb4_0900_bin規則,權重基於程式碼點,可能添加了前導零字節。 * 對於utf8mb4_0900_bin,權重是utf8mb4編碼字節。排序順序與 for 相同utf8mb4_bin,但要快得多。

將其翻譯成人類,他們說對於諸如 U+FF9D 之類的程式碼點,utf8mb4_bin將看到EF BE 9D的 UTF-8 編碼字節序列並將其轉換為00 FF 9D。但是,utf8mb4_0900_bin不會其轉換為程式碼點值。這是由於 UTF-8 字節序列已經是連續的,因此順序與程式碼點值的順序相同。那麼,為什麼還要費心那個額外的轉換步驟呢?

引用自:https://dba.stackexchange.com/questions/278010