INFORMATION_SCHEMA
資料表中的字串資料行具有 utf8mb3_general_ci
的校對,這是區分大小寫的。但是,對於對應於檔案系統中表示的物件(例如資料庫和資料表)的值,INFORMATION_SCHEMA
字串資料行中的搜尋可以是區分大小寫或不區分大小寫,具體取決於基礎檔案系統的特性和 lower_case_table_names
系統變數設定。例如,如果檔案系統區分大小寫,則搜尋可能會區分大小寫。本節說明此行為以及如何在必要時修改它。
假設查詢在 SCHEMATA.SCHEMA_NAME
資料行中搜尋 test
資料庫。在 Linux 上,檔案系統區分大小寫,因此 SCHEMATA.SCHEMA_NAME
與 'test'
的比較會相符,但與 'TEST'
的比較則不會
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test |
+-------------+
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'TEST';
Empty set (0.00 sec)
當 lower_case_table_names
系統變數設定為 0 時,會發生這些結果。lower_case_table_names
設定為 1 或 2 會使第二個查詢傳回與第一個查詢相同的(非空的)結果。
禁止以與伺服器初始化時所用的設定不同的 lower_case_table_names
設定啟動伺服器。
在 Windows 或 macOS 上,檔案系統不區分大小寫,因此比較會同時符合 'test'
和 'TEST'
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test |
+-------------+
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| TEST |
+-------------+
lower_case_table_names
的值在此內容中沒有影響。
發生上述行為的原因是,當搜尋對應於檔案系統中表示的物件的值時,不會將 utf8mb3_general_ci
校對用於 INFORMATION_SCHEMA
查詢。
如果對 INFORMATION_SCHEMA
資料行執行字串運算的結果與預期不同,則一個解決方法是使用明確的 COLLATE
子句來強制使用合適的校對(請參閱第 12.8.1 節,「在 SQL 陳述式中使用 COLLATE」)。例如,若要執行不區分大小寫的搜尋,請將 COLLATE
與 INFORMATION_SCHEMA
資料行名稱搭配使用
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME COLLATE utf8mb3_general_ci = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test |
+-------------+
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME COLLATE utf8mb3_general_ci = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| test |
+-------------+
WHERE UPPER(SCHEMA_NAME) = 'TEST'
WHERE LOWER(SCHEMA_NAME) = 'test'
雖然即使在具有區分大小寫檔案系統的平台上也可以執行不區分大小寫的比較,如剛剛所示,但這不一定是始終正確的做法。在此類平台上,可能會有多個名稱僅在字母大小寫上不同的物件。例如,名稱為 city
、CITY
和 City
的資料表可以同時存在。請考慮搜尋應符合所有此類名稱還是僅符合一個,並相應地撰寫查詢。下列第一個比較 (使用 utf8mb3_bin
) 區分大小寫;其他則不區分
WHERE TABLE_NAME COLLATE utf8mb3_bin = 'City'
WHERE TABLE_NAME COLLATE utf8mb3_general_ci = 'city'
WHERE UPPER(TABLE_NAME) = 'CITY'
WHERE LOWER(TABLE_NAME) = 'city'
在 INFORMATION_SCHEMA
字串資料行中搜尋參考 INFORMATION_SCHEMA
本身的值時,會使用 utf8mb3_general_ci
校對,因為 INFORMATION_SCHEMA
是未在檔案系統中表示的「虛擬」資料庫。例如,與 SCHEMATA.SCHEMA_NAME
的比較會符合 'information_schema'
或 'INFORMATION_SCHEMA'
,而無論平台為何
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'information_schema';
+--------------------+
| SCHEMA_NAME |
+--------------------+
| information_schema |
+--------------------+
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'INFORMATION_SCHEMA';
+--------------------+
| SCHEMA_NAME |
+--------------------+
| information_schema |
+--------------------+