對於非二進位字串 (CHAR
、VARCHAR
、TEXT
),字串搜尋會使用比較運算元的校對。對於二進位字串 (BINARY
、VARBINARY
、BLOB
),比較會使用運算元中位元組的數值;這表示對於字母字元,比較會區分大小寫。
非二進位字串和二進位字串之間的比較會視為二進位字串的比較。
簡單的比較運算 (>=、>、=、<、<=
、排序和分組) 是根據每個字元的「排序值」。排序值相同的字元會視為相同的字元。例如,如果 e
和 é
在給定的校對中具有相同的排序值,則它們的比較會相等。
預設字元集和校對為 utf8mb4
和 utf8mb4_0900_ai_ci
,因此預設情況下,非二進位字串比較不區分大小寫。這表示如果您使用
搜尋,您會取得所有以 col_name
LIKE 'a%'A
或 a
開頭的資料行值。若要使此搜尋區分大小寫,請確定其中一個運算元具有區分大小寫或二進位的校對。例如,如果您比較一個資料行和一個字串,這兩者都具有 utf8mb4
字元集,您可以使用 COLLATE
運算子,讓任一個運算元具有 utf8mb4_0900_as_cs
或 utf8mb4_bin
校對
col_name COLLATE utf8mb4_0900_as_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE utf8mb4_0900_as_cs
col_name COLLATE utf8mb4_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE utf8mb4_bin
如果您希望資料行一律以區分大小寫的方式處理,請使用區分大小寫或二進位校對來宣告它。請參閱章節 15.1.20,「CREATE TABLE 陳述式」。
若要使非二進位字串的區分大小寫比較不區分大小寫,請使用 COLLATE
來命名不區分大小寫的校對。下列範例中的字串通常區分大小寫,但 COLLATE
會將比較變更為不區分大小寫
mysql> SET NAMES 'utf8mb4';
mysql> SET @s1 = 'MySQL' COLLATE utf8mb4_bin,
@s2 = 'mysql' COLLATE utf8mb4_bin;
mysql> SELECT @s1 = @s2;
+-----------+
| @s1 = @s2 |
+-----------+
| 0 |
+-----------+
mysql> SELECT @s1 COLLATE utf8mb4_0900_ai_ci = @s2;
+--------------------------------------+
| @s1 COLLATE utf8mb4_0900_ai_ci = @s2 |
+--------------------------------------+
| 1 |
+--------------------------------------+
二進位字串在比較中會區分大小寫。若要將字串比較為不區分大小寫,請將其轉換為非二進位字串,並使用 COLLATE
來命名不區分大小寫的校對
mysql> SET @s = BINARY 'MySQL';
mysql> SELECT @s = 'mysql';
+--------------+
| @s = 'mysql' |
+--------------+
| 0 |
+--------------+
mysql> SELECT CONVERT(@s USING utf8mb4) COLLATE utf8mb4_0900_ai_ci = 'mysql';
+----------------------------------------------------------------+
| CONVERT(@s USING utf8mb4) COLLATE utf8mb4_0900_ai_ci = 'mysql' |
+----------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------+
若要判斷值是以非二進位字串還是二進位字串比較,請使用 COLLATION()
函數。此範例顯示 VERSION()
傳回的字串具有不區分大小寫的校對,因此比較不區分大小寫
mysql> SELECT COLLATION(VERSION());
+----------------------+
| COLLATION(VERSION()) |
+----------------------+
| utf8mb3_general_ci |
+----------------------+
對於二進位字串,校對值為 binary
,因此比較會區分大小寫。您可能會看到 binary
的其中一種情況是壓縮函數,它們通常會傳回二進位字串:字串
mysql> SELECT COLLATION(COMPRESS('x'));
+--------------------------+
| COLLATION(COMPRESS('x')) |
+--------------------------+
| binary |
+--------------------------+
若要檢查字串的排序值,WEIGHT_STRING()
可能會很有用。請參閱章節 14.8,「字串函數和運算子」。