文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
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 語句。對於 SHOW 語句,如果您省略 FROM db_name 子句,則會顯示預設資料庫的資訊。您通常可以透過將 AND TABLE_SCHEMA = SCHEMA() 條件新增至從 INFORMATION_SCHEMA 資料表擷取資訊的查詢的 WHERE 子句,來選取預設資料庫的資訊。

相關資訊

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