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
語句。對於 SHOW
語句,如果您省略 FROM
子句,則會顯示預設資料庫的資訊。您通常可以透過將 db_name
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 8.4 常見問題:INFORMATION_SCHEMA」INFORMATION_SCHEMA
查詢和最佳化工具:第 10.2.3 節「最佳化 INFORMATION_SCHEMA 查詢」定序對
INFORMATION_SCHEMA
比較的效果:第 12.8.7 節「在 INFORMATION_SCHEMA 搜尋中使用定序」