對於非二進位字串(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 節「字串函式和運算子」。