INFORMATION_SCHEMA
提供對資料庫元資料的存取,即關於 MySQL 伺服器的資訊,例如資料庫或表格的名稱、欄位的資料類型或存取權限。有時用於此資訊的其他術語包括資料字典和系統目錄。
INFORMATION_SCHEMA
是每個 MySQL 實例中的一個資料庫,它儲存了 MySQL 伺服器維護的所有其他資料庫的資訊。INFORMATION_SCHEMA
資料庫包含幾個唯讀表格。它們實際上是視圖,而不是基底表格,因此沒有與它們相關聯的檔案,並且您無法在它們上設定觸發程序。此外,沒有以此名稱命名的資料庫目錄。
雖然您可以使用 USE
陳述式選擇 INFORMATION_SCHEMA
作為預設資料庫,但您只能讀取表格的內容,而不能對其執行 INSERT
、UPDATE
或 DELETE
操作。
以下是從 INFORMATION_SCHEMA
擷取資訊的陳述式範例
mysql> SELECT table_name, table_type, engine
FROM information_schema.tables
WHERE table_schema = 'db5'
ORDER BY table_name;
+------------+------------+--------+
| table_name | table_type | engine |
+------------+------------+--------+
| fk | BASE TABLE | InnoDB |
| fk2 | BASE TABLE | InnoDB |
| goto | BASE TABLE | MyISAM |
| into | BASE TABLE | MyISAM |
| k | BASE TABLE | MyISAM |
| kurs | BASE TABLE | MyISAM |
| loop | BASE TABLE | MyISAM |
| pk | BASE TABLE | InnoDB |
| t | BASE TABLE | MyISAM |
| t2 | BASE TABLE | MyISAM |
| t3 | BASE TABLE | MyISAM |
| t7 | BASE TABLE | MyISAM |
| tables | BASE TABLE | MyISAM |
| v | VIEW | NULL |
| v2 | VIEW | NULL |
| v3 | VIEW | NULL |
| v56 | VIEW | NULL |
+------------+------------+--------+
17 rows in set (0.01 sec)
說明:該陳述式請求資料庫 db5
中所有表格的列表,僅顯示三條資訊:表格的名稱、其類型和其儲存引擎。
預設情況下,所有描述表格欄位、索引或兩者的 INFORMATION_SCHEMA
表格中都會顯示有關產生的隱形主鍵的資訊,例如 COLUMNS
和 STATISTICS
表格。如果您希望在從這些表格中選取的查詢中隱藏此類資訊,您可以將 show_gipk_in_create_table_and_information_schema
伺服器系統變數的值設定為 OFF
。如需更多資訊,請參閱第 15.1.20.11 節,「產生的隱形主鍵」。
字元欄位(例如 TABLES.TABLE_NAME
)的定義通常為 VARCHAR(
,其中 N
) CHARACTER SET utf8mb3N
至少為 64。MySQL 對於此字元集的所有搜尋、排序、比較和此類欄位的其他字串操作,都使用預設的定序 (utf8mb3_general_ci
)。
由於某些 MySQL 物件以檔案形式表示,因此 INFORMATION_SCHEMA
字串欄位中的搜尋可能會受到檔案系統區分大小寫的影響。如需更多資訊,請參閱第 12.8.7 節,「在 INFORMATION_SCHEMA 搜尋中使用定序」。
SELECT ... FROM INFORMATION_SCHEMA
陳述式旨在以更一致的方式提供對 MySQL 支援的各種 SHOW
陳述式(SHOW DATABASES
、SHOW TABLES
等等)所提供資訊的存取。與 SHOW
相比,使用 SELECT
具有以下優勢:
它符合 Codd 的規則,因為所有存取都在表格上完成。
您可以使用
SELECT
陳述式的熟悉語法,並且只需要學習一些表格和欄位的名稱。實作者無需擔心新增關鍵字。
您可以將
INFORMATION_SCHEMA
查詢中的結果篩選、排序、串連和轉換成您的應用程式需要的任何格式,例如資料結構或要剖析的文字表示。此技術與其他資料庫系統的互通性更高。例如,Oracle 資料庫使用者熟悉查詢 Oracle 資料字典中的表格。
由於 SHOW
語法相當常見且廣泛使用,SHOW
語法仍然作為一種替代方案。事實上,隨著 INFORMATION_SCHEMA
的實作,SHOW
語法也獲得了增強,詳情請見第 28.8 節,「SHOW 語法的擴充」。
對於大多數的 INFORMATION_SCHEMA
表格,每個 MySQL 使用者都有權限存取,但只能看到表格中對應使用者具有適當存取權限的物件的資料列。在某些情況下(例如,INFORMATION_SCHEMA
ROUTINES
表格中的 ROUTINE_DEFINITION
欄位),權限不足的使用者會看到 NULL
。有些表格具有不同的權限要求;對於這些表格,相關要求會在適用的表格說明中提及。例如,InnoDB
表格(名稱以 INNODB_
開頭的表格)需要 PROCESS
權限。
相同的權限適用於從 INFORMATION_SCHEMA
選擇資訊,以及透過 SHOW
語法檢視相同的資訊。無論是哪種情況,您都必須對物件擁有某些權限才能看到關於它的資訊。
從多個資料庫搜尋資訊的 INFORMATION_SCHEMA
查詢可能需要很長時間,並影響效能。要檢查查詢的效率,您可以使用 EXPLAIN
。有關使用 EXPLAIN
輸出調整 INFORMATION_SCHEMA
查詢的資訊,請參閱第 10.2.3 節,「最佳化 INFORMATION_SCHEMA 查詢」。
MySQL 中 INFORMATION_SCHEMA
表格結構的實作遵循 ANSI/ISO SQL:2003 標準第 11 部分 Schemata。我們的目標是大致符合 SQL:2003 核心功能 F021 基本資訊綱要。
SQL Server 2000(也遵循該標準)的使用者可能會注意到它們之間有高度相似之處。然而,MySQL 省略了許多與我們的實作不相關的欄位,並新增了 MySQL 特有的欄位。其中一個新增的欄位是 INFORMATION_SCHEMA
TABLES
表格中的 ENGINE
欄位。
儘管其他 DBMS 使用各種名稱,例如 syscat
或 system
,但標準名稱是 INFORMATION_SCHEMA
。
為了避免使用任何在標準或 DB2、SQL Server 或 Oracle 中保留的名稱,我們更改了一些標記為「“MySQL 擴充功能”」的欄位的名稱。(例如,我們將 TABLES
表格中的 COLLATION
更改為 TABLE_COLLATION
。)請參閱本文末尾附近的保留字清單:https://web.archive.org/web/20070428032454/http://www.dbazine.com/db2/db2-disarticles/gulutzan5。
以下章節將說明 INFORMATION_SCHEMA
中的每個表格和欄位。對於每個欄位,都有三條資訊:
許多章節會指出哪些 SHOW
語法等效於從 INFORMATION_SCHEMA
擷取資訊的 SELECT
語法。對於在您省略 FROM
子句時顯示預設資料庫資訊的 db_name
SHOW
語法,您通常可以透過將 AND TABLE_SCHEMA = SCHEMA()
條件新增至從 INFORMATION_SCHEMA
表格擷取資訊的查詢的 WHERE
子句,來選擇預設資料庫的資訊。
這些章節討論其他與 INFORMATION_SCHEMA
相關的主題:
有關
InnoDB
儲存引擎特有的INFORMATION_SCHEMA
表格的資訊:第 28.4 節,「INFORMATION_SCHEMA InnoDB 表格」有關執行緒集區外掛程式特有的
INFORMATION_SCHEMA
表格的資訊:第 28.5 節,「INFORMATION_SCHEMA 執行緒集區表格」有關
CONNECTION_CONTROL
外掛程式特有的INFORMATION_SCHEMA
表格的資訊:第 28.6 節,「INFORMATION_SCHEMA 連線控制表格」有關
INFORMATION_SCHEMA
資料庫的常見問題解答:第 A.7 節,「MySQL 9.0 FAQ:INFORMATION_SCHEMA」INFORMATION_SCHEMA
查詢和最佳化工具:第 10.2.3 節,「最佳化 INFORMATION_SCHEMA 查詢」定序對
INFORMATION_SCHEMA
比較的影響:第 12.8.7 節,「在 INFORMATION_SCHEMA 搜尋中使用定序」