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
语句使用起来很熟悉且应用广泛,所以它仍然可以作为替代方案。实际上,除了实现 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 部分 模式。我们的目标是近似符合 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
语句,您通常可以通过在从 INFORMATION_SCHEMA
表检索信息的查询的 WHERE
子句中添加 AND TABLE_SCHEMA = SCHEMA()
条件来选择默认数据库的信息。
这些部分讨论了其他与 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 搜索中使用排序规则”