本節說明二進位字串的 binary
排序規則與非二進位字串的 _bin
排序規則的比較方式。
二進位字串 (使用 BINARY
、VARBINARY
和 BLOB
資料類型儲存) 具有名為 binary
的字元集和排序規則。二進位字串是位元組序列,這些位元組的數值決定了比較和排序順序。請參閱第 12.10.8 節,「二進位字元集」。
非二進位字串 (使用 CHAR
、VARCHAR
和 TEXT
資料類型儲存) 具有非 binary
的字元集和排序規則。指定的非二進位字元集可以有多個排序規則,每個排序規則都為集合中的字元定義特定的比較和排序順序。對於大多數字元集,其中一個是二進位排序規則,在排序規則名稱中以 _bin
字尾表示。例如,latin1
和 big5
的二進位排序規則分別命名為 latin1_bin
和 big5_bin
。utf8mb4
是一個例外,它有兩個二進位排序規則:utf8mb4_bin
和 utf8mb4_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;
使用字串文字為
INSERT
或UPDATE
指派資料行值時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 SPACE
或 NO PAD
大多數 MySQL 排序規則的 pad 屬性為
PAD SPACE
。基於 UCA 9.0.0 和更高版本的 Unicode 排序規則的 pad 屬性為
NO PAD
;請參閱第 12.10.1 節,「Unicode 字元集」。
對於非二進位字串 (CHAR
、VARCHAR
和 TEXT
值),字串排序規則 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
模式比對運算子,無論排序規則如何,尾隨空格對於此運算子都很重要。
對於二進位字串 (BINARY
、VARBINARY
和 BLOB
值),所有位元組在比較中都很重要,包括尾隨空格
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 |
+------+------------------------+--------+----------------------+