文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


28.1 簡介

INFORMATION_SCHEMA 提供對資料庫元資料的存取,即關於 MySQL 伺服器的資訊,例如資料庫或表格的名稱、欄位的資料類型或存取權限。有時用於此資訊的其他術語包括資料字典系統目錄

INFORMATION_SCHEMA 使用注意事項

INFORMATION_SCHEMA 是每個 MySQL 實例中的一個資料庫,它儲存了 MySQL 伺服器維護的所有其他資料庫的資訊。INFORMATION_SCHEMA 資料庫包含幾個唯讀表格。它們實際上是視圖,而不是基底表格,因此沒有與它們相關聯的檔案,並且您無法在它們上設定觸發程序。此外,沒有以此名稱命名的資料庫目錄。

雖然您可以使用 USE 陳述式選擇 INFORMATION_SCHEMA 作為預設資料庫,但您只能讀取表格的內容,而不能對其執行 INSERTUPDATEDELETE 操作。

以下是從 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 表格中都會顯示有關產生的隱形主鍵的資訊,例如 COLUMNSSTATISTICS 表格。如果您希望在從這些表格中選取的查詢中隱藏此類資訊,您可以將 show_gipk_in_create_table_and_information_schema 伺服器系統變數的值設定為 OFF。如需更多資訊,請參閱第 15.1.20.11 節,「產生的隱形主鍵」

字元集考量

字元欄位(例如 TABLES.TABLE_NAME)的定義通常為 VARCHAR(N) CHARACTER SET utf8mb3,其中 N 至少為 64。MySQL 對於此字元集的所有搜尋、排序、比較和此類欄位的其他字串操作,都使用預設的定序 (utf8mb3_general_ci)。

由於某些 MySQL 物件以檔案形式表示,因此 INFORMATION_SCHEMA 字串欄位中的搜尋可能會受到檔案系統區分大小寫的影響。如需更多資訊,請參閱第 12.8.7 節,「在 INFORMATION_SCHEMA 搜尋中使用定序」

INFORMATION_SCHEMA 作為 SHOW 陳述式的替代方案

SELECT ... FROM INFORMATION_SCHEMA 陳述式旨在以更一致的方式提供對 MySQL 支援的各種 SHOW 陳述式(SHOW DATABASESSHOW TABLES 等等)所提供資訊的存取。與 SHOW 相比,使用 SELECT 具有以下優勢:

  • 它符合 Codd 的規則,因為所有存取都在表格上完成。

  • 您可以使用 SELECT 陳述式的熟悉語法,並且只需要學習一些表格和欄位的名稱。

  • 實作者無需擔心新增關鍵字。

  • 您可以將 INFORMATION_SCHEMA 查詢中的結果篩選、排序、串連和轉換成您的應用程式需要的任何格式,例如資料結構或要剖析的文字表示。

  • 此技術與其他資料庫系統的互通性更高。例如,Oracle 資料庫使用者熟悉查詢 Oracle 資料字典中的表格。

由於 SHOW 語法相當常見且廣泛使用,SHOW 語法仍然作為一種替代方案。事實上,隨著 INFORMATION_SCHEMA 的實作,SHOW 語法也獲得了增強,詳情請見第 28.8 節,「SHOW 語法的擴充」

INFORMATION_SCHEMA 與權限

對於大多數的 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 使用各種名稱,例如 syscatsystem,但標準名稱是 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 參考章節中的慣例

以下章節將說明 INFORMATION_SCHEMA 中的每個表格和欄位。對於每個欄位,都有三條資訊:

  • INFORMATION_SCHEMA 名稱表示 INFORMATION_SCHEMA 表格中欄位的名稱。除非「備註」欄位說明為「MySQL 擴充功能。」,否則此名稱會對應到標準 SQL 名稱。

  • SHOW 名稱表示最接近的 SHOW 語法中的等效欄位名稱(如果有的話)。

  • 備註提供適用的其他資訊。如果此欄位為 NULL,則表示欄位的值一律為 NULL。如果此欄位說明為「MySQL 擴充功能,」,則表示該欄位是標準 SQL 的 MySQL 擴充功能。

許多章節會指出哪些 SHOW 語法等效於從 INFORMATION_SCHEMA 擷取資訊的 SELECT 語法。對於在您省略 FROM db_name 子句時顯示預設資料庫資訊的 SHOW 語法,您通常可以透過將 AND TABLE_SCHEMA = SCHEMA() 條件新增至從 INFORMATION_SCHEMA 表格擷取資訊的查詢的 WHERE 子句,來選擇預設資料庫的資訊。

相關資訊

這些章節討論其他與 INFORMATION_SCHEMA 相關的主題: