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


MySQL 8.4 參考手冊  /  ...  /  在 INFORMATION_SCHEMA 搜尋中使用校對

12.8.7 在 INFORMATION_SCHEMA 搜尋中使用校對

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」)。例如,若要執行不區分大小寫的搜尋,請將 COLLATEINFORMATION_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        |
+-------------+

您也可以使用 UPPER()LOWER() 函數

WHERE UPPER(SCHEMA_NAME) = 'TEST'
WHERE LOWER(SCHEMA_NAME) = 'test'

雖然即使在具有區分大小寫檔案系統的平台上也可以執行不區分大小寫的比較,如剛剛所示,但這不一定是始終正確的做法。在此類平台上,可能會有多個名稱僅在字母大小寫上不同的物件。例如,名稱為 cityCITYCity 的資料表可以同時存在。請考慮搜尋應符合所有此類名稱還是僅符合一個,並相應地撰寫查詢。下列第一個比較 (使用 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 |
+--------------------+