Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


28.1 简介

INFORMATION_SCHEMA 提供对 MySQL 服务器的数据库元数据访问,例如数据库或表名、列数据类型或访问权限。其他有时用于描述这种信息的术语是数据字典系统目录

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 作为 显示语句的替代方法

语句SELECT ... FROM INFORMATION_ SCHEMA旨在提供一种更一致的方式来访问 MySQL 支持的各种SHOW语句所提供的信息(例如SHOW DATABASESSHOW TABLES等)。使用SELECT语句具有以下优点,相比于SHOW语句:

  • 它符合 Codd 规则,因为所有访问都是在表上进行的。

  • 您可以使用SELECT语句的熟悉语法,并且只需要学习一些表和列名。

  • 实现者不需要担心添加关键字。

  • 您可以使用INFORMATION_SCHEMA查询结果来过滤、排序、concatenate和转换成应用程序所需的格式,例如数据结构或文本表示形式以便解析。

  • 这种技术与其他数据库系统之间更加 interoperable。例如,Oracle Database用户熟悉查询 Oracle 数据字典中的表。

由于SHOW广泛使用和熟悉,因此SHOW语句仍然作为备选方案。实际上,INFORMATION_SCHEMA实现中还有一些SHOW语句的增强功能,如第28.8节,“SHOW 语句扩展”中所述。

对于大多数INFORMATION_SCHEMA表,每个MySQL用户都有权访问它们,但只能看到对应于该用户拥有适当访问权限的对象的行。在某些情况下(例如,ROUTINE_DEFINITION列在INFORMATION_SCHEMAROUTINES表中),权限不足的用户将看到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_SCHEMATABLES中的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 Name”表示在INFORMATION_SCHEMA表中的列名。这对应于标准SQL名称,除非Remarks”字段说MySQL 扩展.”

  • SHOW Name”表示在最接近的SHOW语句中的等效字段名,如果存在。

  • 备注 提供了相关的补充信息。如果该字段为 NULL,表示该列的值总是 NULL。如果该字段说 MySQL 扩展, 则该列是 MySQL 对标准 SQL 的扩展。

许多部分指出哪些SHOW 语句等同于一个SELECT,用于从 INFORMATION_SCHEMA 表中检索信息。对于显示默认数据库的SHOW 语句,如果您省略了 FROM db_name 子句,您可以通过在查询中添加一个 AND TABLE_SCHEMA = SCHEMA() 条件来选择默认数据库的信息,从而检索来自 INFORMATION_SCHEMA 表中的信息。

这些部分讨论了关于 INFORMATION_SCHEMA 的其他主题: