文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  binary 校對與 _bin 校對的比較

12.8.5 binary 校對與 _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 SPACENO PAD

對於非二進位字串(CHARVARCHARTEXT 值),字串校對填補屬性決定字串末尾尾隨空格在比較中的處理方式

  • 對於 PAD SPACE 校對,尾隨空格在比較中並不重要;字串的比較不考慮尾隨空格。

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

可以使用兩種 utf8mb4 二進位排序規則來示範不同的行為,其中一種是 PAD SPACE,另一種是 NO PAD。此範例還展示如何使用 INFORMATION_SCHEMACOLLATIONS 表格來判斷排序規則的填充屬性。

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 |
+------+------------------------+--------+----------------------+