INFORMATION_SCHEMA
提供了数据库 元数据 的访问,包括 MySQL 服务器的信息,如数据库或表的名称、列的数据类型或访问权限。其他术语有时用于描述这些信息是 数据字典 和 系统目录。
INFORMATION_SCHEMA
是 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
等)。使用 SELECT
有以下优点,相比 SHOW
:
-
它符合 Codd 的规则,因为所有访问都是在表上进行的。
-
您可以使用熟悉的
SELECT
语句语法,只需要学习一些表和列名。 -
实现者不需要担心添加关键字。
-
您可以过滤、排序、连接和转换
INFORMATION_SCHEMA
查询结果,以满足应用程序的需求,例如数据结构或文本表示形式以供解析。 -
这种技术与其他数据库系统更加互操作。例如,Oracle Database 用户熟悉查询 Oracle 数据字典中的表。
因为 SHOW
是熟悉的且广泛使用的,因此 SHOW
语句仍然作为替代方案。事实上,随着 INFORMATION_SCHEMA
的实现,还有对 SHOW
的增强,如 第 28.8 节,“SHOW 语句的扩展” 所述。
对于大多数 INFORMATION_SCHEMA
表,每个 MySQL 用户都有权访问它们,但只能看到对应于用户拥有适当访问权限的对象的行。在某些情况下(例如,ROUTINE_DEFINITION
列在 INFORMATION_SCHEMA
ROUTINES
表中),用户如果没有足够的权限,将看到 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()
条件到 WHERE
子句来检索默认数据库的信息。
这些部分讨论了其他 INFORMATION_SCHEMA
相关主题:
-
关于
INFORMATION_SCHEMA
表的信息,特定于InnoDB
存储引擎:Section 28.4, “INFORMATION_SCHEMA InnoDB Tables” -
关于
INFORMATION_SCHEMA
表的信息,特定于线程池插件:Section 28.5, “INFORMATION_SCHEMA Thread Pool Tables” -
关于
INFORMATION_SCHEMA
表的信息,特定于CONNECTION_CONTROL
插件:第 28.6 节,“INFORMATION_SCHEMA 连接控制表” -
关于
INFORMATION_SCHEMA
数据库的常见问题解答:附录 A.7,“MySQL 8.3 FAQ: INFORMATION_SCHEMA” -
INFORMATION_SCHEMA
查询和优化器:第 10.2.3 节,“优化 INFORMATION_SCHEMA 查询” -
排序对
INFORMATION_SCHEMA
比较的影响:第 12.8.7 节,“在 INFORMATION_SCHEMA 搜索中使用排序”