文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  二進位排序規則與 _bin 排序規則的比較

12.8.5 二進位排序規則與 _bin 排序規則的比較

本節說明二進位字串的 binary 排序規則與非二進位字串的 _bin 排序規則的比較方式。

二進位字串 (使用 BINARYVARBINARYBLOB 資料類型儲存) 具有名為 binary 的字元集和排序規則。二進位字串是位元組序列,這些位元組的數值決定了比較和排序順序。請參閱第 12.10.8 節,「二進位字元集」

非二進位字串 (使用 CHARVARCHARTEXT 資料類型儲存) 具有非 binary 的字元集和排序規則。指定的非二進位字元集可以有多個排序規則,每個排序規則都為集合中的字元定義特定的比較和排序順序。對於大多數字元集,其中一個是二進位排序規則,在排序規則名稱中以 _bin 字尾表示。例如,latin1big5 的二進位排序規則分別命名為 latin1_binbig5_binutf8mb4 是一個例外,它有兩個二進位排序規則:utf8mb4_binutf8mb4_0900_bin;請參閱第 12.10.1 節,「Unicode 字元集」

binary 排序規則在以下幾個方面與 _bin 排序規則不同,將在以下各節中討論

比較和排序的單位

二進位字串是位元組序列。對於 binary 排序規則,比較和排序基於數值位元組值。非二進位字串是字元序列,可能是多位元組。非二進位字串的排序規則定義了字元值的排序,用於比較和排序。對於 _bin 排序規則,此排序基於數值字元碼值,這與二進位字串的排序類似,不同之處在於字元碼值可能是多位元組。

字元集轉換

非二進位字串具有字元集,在許多情況下會自動轉換為另一個字元集,即使字串具有 _bin 排序規則也是如此

  • 將資料行值指派給具有不同字元集的另一個資料行時

    UPDATE t1 SET utf8mb4_bin_column=latin1_column;
    INSERT INTO t1 (latin1_column) SELECT utf8mb4_bin_column FROM t2;
  • 使用字串文字為 INSERTUPDATE 指派資料行值時

    SET NAMES latin1;
    INSERT INTO t1 (utf8mb4_bin_column) VALUES ('string-in-latin1');
  • 將結果從伺服器傳送到用戶端時

    SET NAMES latin1;
    SELECT utf8mb4_bin_column FROM t2;

對於二進位字串資料行,不會發生轉換。對於與上述類似的情況,字串值會按位元組複製。

字母大小寫轉換

非二進位字元集的排序規則提供有關字元字母大小寫的資訊,因此即使對於忽略字母大小寫進行排序的 _bin 排序規則,非二進位字串中的字元也可以從一個字母大小寫轉換為另一個字母大小寫

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
mysql> SELECT LOWER('aA'), UPPER('zZ');
+-------------+-------------+
| LOWER('aA') | UPPER('zZ') |
+-------------+-------------+
| aa          | ZZ          |
+-------------+-------------+

字母大小寫的概念不適用於二進位字串中的位元組。若要執行字母大小寫轉換,必須先將字串轉換為非二進位字串,並使用適合儲存在字串中的資料的字元集

mysql> SET NAMES binary;
mysql> SELECT LOWER('aA'), LOWER(CONVERT('aA' USING utf8mb4));
+-------------+------------------------------------+
| LOWER('aA') | LOWER(CONVERT('aA' USING utf8mb4)) |
+-------------+------------------------------------+
| aA          | aa                                 |
+-------------+------------------------------------+

比較中尾隨空格的處理

MySQL 排序規則具有 pad 屬性,其值為 PAD SPACENO PAD

對於非二進位字串 (CHARVARCHARTEXT 值),字串排序規則 pad 屬性決定了字串結尾尾隨空格在比較中的處理方式

  • 對於 PAD SPACE 排序規則,尾隨空格在比較中無關緊要;比較字串時不考慮尾隨空格。

  • NO PAD 排序規則會將尾隨空格視為比較中重要的字元,就像任何其他字元一樣。

可以使用兩個 utf8mb4 二進位排序規則來示範不同的行為,其中一個是 PAD SPACE,另一個是 NO PAD。此範例也說明如何使用 INFORMATION_SCHEMA COLLATIONS 資料表來判斷排序規則的 pad 屬性。

mysql> SELECT COLLATION_NAME, PAD_ATTRIBUTE
       FROM INFORMATION_SCHEMA.COLLATIONS
       WHERE COLLATION_NAME LIKE 'utf8mb4%bin';
+------------------+---------------+
| COLLATION_NAME   | PAD_ATTRIBUTE |
+------------------+---------------+
| utf8mb4_bin      | PAD SPACE     |
| utf8mb4_0900_bin | NO PAD        |
+------------------+---------------+
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          1 |
+------------+
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_0900_bin;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          0 |
+------------+
注意

此處的「比較」不包括 LIKE 模式比對運算子,無論排序規則如何,尾隨空格對於此運算子都很重要。

對於二進位字串 (BINARYVARBINARYBLOB 值),所有位元組在比較中都很重要,包括尾隨空格

mysql> SET NAMES binary;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          0 |
+------------+

插入和擷取時尾隨空格的處理

CHAR(N) 資料行儲存長度為 N 個字元的非二進位字串。對於插入,短於 N 個字元的值會以空格擴充。對於擷取,會移除尾隨空格。

BINARY(N) 資料行儲存長度為 N 個位元組的二進位字串。對於插入,短於 N 個位元組的值會以 0x00 位元組擴充。對於擷取,不會移除任何內容;一律會傳回宣告長度的值。

mysql> CREATE TABLE t1 (
         a CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
         b BINARY(10)
       );
mysql> INSERT INTO t1 VALUES ('x','x');
mysql> INSERT INTO t1 VALUES ('x ','x ');
mysql> SELECT a, b, HEX(a), HEX(b) FROM t1;
+------+------------------------+--------+----------------------+
| a    | b                      | HEX(a) | HEX(b)               |
+------+------------------------+--------+----------------------+
| x    | 0x78000000000000000000 | 78     | 78000000000000000000 |
| x    | 0x78200000000000000000 | 78     | 78200000000000000000 |
+------+------------------------+--------+----------------------+