## 26.1 简介

`INFORMATION_SCHEMA`提供对数据库元数据、有关 MySQL 服务器的信息（例如数据库或表的名称、列的数据类型或访问权限）的访问。有时用于此信息的其他术语是数据字典和系统目录。

-   [信息\_SCHEMA 使用说明](information-schema-introduction.html#information-schema-usage-notes)

-   [字符集注意事项](information-schema-introduction.html#information-schema-character-set-considerations)

-   [信息\_SCHEMA 作为 SHOW 语句的替代方案](information-schema-introduction.html#information-schema-as-show-alternative)

-   [信息\_SCHEMA 和特权](information-schema-introduction.html#information-schema-privileges)

-   [性能注意事项](information-schema-introduction.html#information-schema-performance-considerations)

-   [标准注意事项](information-schema-introduction.html#information-schema-standards-considerations)

-   [INFORMATION中的约定\_SCHEMA 参考部分](information-schema-introduction.html#information-schema-conventions)

-   [相关信息](information-schema-introduction.html#information-schema-related-information)

### 信息\_SCHEMA 使用说明

`INFORMATION_SCHEMA`是每个 MySQL 实例中的数据库，该位置存储有关 MySQL 服务器维护的所有其他数据库的信息。这`INFORMATION_SCHEMA`数据库包含几个只读表。它们实际上是视图，而不是基表，因此没有与它们关联的文件，并且您不能在它们上设置触发器。此外，没有具有该名称的数据库目录。

虽然可以选择`INFORMATION_SCHEMA`作为默认数据库[`采用`](use.html)语句，只能读取表的内容，不能执行[`插入`](insert.html), [`更新`](update.html)， 要么[`删除`](delete.html)对它们进行操作。

以下是从以下位置检索信息的语句示例`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`，只显示三条信息：表的名称、类型和存储引擎。

### 字符集注意事项

字符列的定义（例如，`TABLES.TABLE_NAME`) 通常是`VARCHAR(*`ñ`*) 字符集 utf8`在哪里*`ñ`*至少为 64。MySQL 使用此字符集的默认排序规则 (`utf8_general_ci`) 用于此类列上的所有搜索、排序、比较和其他字符串操作。

因为一些 MySQL 对象被表示为文件，所以在`INFORMATION_SCHEMA`字符串列可能会受到文件系统区分大小写的影响。有关详细信息，请参阅[第 10.8.7 节，“在 INFORMATION 中使用排序规则\_SCHEMA 搜索”](charset-collation-information-schema.html).

### 信息\_SCHEMA 作为 SHOW 语句的替代方案

这`选择 ... FROM INFORMATION_SCHEMA`声明旨在作为一种更一致的方式来提供对各种提供的信息的访问[`显示`](show.html)MySQL 支持的语句（[`显示数据库`](show-databases.html),[`显示表格`](show-tables.html)，等等）。使用[`选择`](select.html)有这些优点，相比[`显示`](show.html)：

-   它符合 Codd 的规则，因为所有访问都在表上完成。

-   您可以使用熟悉的语法[`选择`](select.html)语句，只需要学习一些表名和列名。

-   实现者不必担心添加关键字。

-   您可以过滤、排序、连接和转换结果`INFORMATION_SCHEMA`查询应用程序需要的任何格式，例如要解析的数据结构或文本表示。

-   这种技术与其他数据库系统的互操作性更强。例如，Oracle 数据库用户熟悉在 Oracle 数据字典中查询表。

    因为[`显示`](show.html)是熟悉和广泛使用的，[`显示`](show.html)声明仍然是一种选择。事实上，随着实施`INFORMATION_SCHEMA`, 有增强[`显示`](show.html)如中所述[第 26.8 节，“SHOW 语句的扩展”](extended-show.html).

### 信息\_SCHEMA 和特权

对于大多数`INFORMATION_SCHEMA`表，每个 MySQL 用户都有权访问它们，但只能看到表中与用户具有适当访问权限的对象相对应的行。在某些情况下（例如，`ROUTINE_DEFINITION`列中的`INFORMATION_SCHEMA` [`例行公事`](information-schema-routines-table.html)表），权限不足的用户请参阅`空值`.有些表有不同的权限要求；对于这些，要求在适用的表格描述中提到。例如，[`InnoDB`](innodb-storage-engine.html)表（名称以`INNODB_`) 要求[`过程`](privileges-provided.html#priv_process)特权。

相同的特权适用于从`INFORMATION_SCHEMA`并通过查看相同的信息[`显示`](show.html)陈述。在任何一种情况下，您都必须对某个对象具有某些特权才能查看有关它的信息。

### 性能注意事项

`INFORMATION_SCHEMA`从多个数据库中搜索信息的查询可能需要很长时间并影响性能。要检查查询的效率，您可以使用[`解释`](explain.html).有关使用的信息[`解释`](explain.html)输出调优`INFORMATION_SCHEMA`查询，见[第 8.2.3 节，“优化信息\_SCHEMA 查询”](information-schema-optimization.html).

### 标准注意事项

的实施`INFORMATION_SCHEMA`MySQL 中的表结构遵循 ANSI/ISO SQL:2003 标准第 11 部分*图式*.我们的意图是大致符合 SQL:2003 核心功能 F021*基本信息架构*.

SQL Server 2000（也遵循该标准）的用户可能会注意到非常相似。但是，MySQL 省略了许多与我们的实现无关的列，并添加了特定于 MySQL 的列。一个这样的添加列是`引擎`列中的`INFORMATION_SCHEMA` [`表格`](information-schema-tables-table.html)桌子。

尽管其他 DBMS 使用各种名称，例如`系统猫`要么`系统`，标准名称为`INFORMATION_SCHEMA`.

为了避免使用标准或 DB2、SQL Server 或 Oracle 中保留的任何名称，我们更改了一些标记为“MySQL 扩展”的列的名称。（例如，我们改变了`整理`到`TABLE_COLLATION`在里面[`表格`](information-schema-tables-table.html)表。）请参阅本文末尾附近的保留字列表：<https://web.archive.org/web/20070428032454/http://www.dbazine.com/db2/db2-disarticles/gulutzan5>.

### INFORMATION中的约定\_SCHEMA 参考部分

以下部分描述了中的每个表和列`INFORMATION_SCHEMA`.对于每一列，有三个信息：

-   “`INFORMATION_SCHEMA`Name”表示列中的名称`INFORMATION_SCHEMA`桌子。这对应于标准 SQL 名称，除非“备注”字段显示“MySQL 扩展”。

-   “[`显示`](show.html)名称”表示最接近的等效字段名称[`显示`](show.html)声明，如果有的话。

-   “备注”在适用的情况下提供附加信息。如果这个字段是`空值`，这意味着该列的值总是`空值`.如果此字段显示“MySQL 扩展”，则该列是标准 SQL 的 MySQL 扩展。

    许多部分表明了什么[`显示`](show.html)声明等价于[`选择`](select.html)从中检索信息`INFORMATION_SCHEMA`.为了[`显示`](show.html)如果省略 a 则显示默认数据库信息的语句`从 *`数据库名称`*`子句，您通常可以通过添加`AND TABLE_SCHEMA = SCHEMA()`条件为`在哪里`从查询中检索信息的子句`INFORMATION_SCHEMA`桌子。

### 相关信息

这些部分讨论了额外的`INFORMATION_SCHEMA`-相关话题：

-   相关信息`INFORMATION_SCHEMA`特定于[`InnoDB`](innodb-storage-engine.html)存储引擎：[第 26.4 节，“信息\_SCHEMA InnoDB 表”](innodb-information-schema-tables.html)

-   相关信息`INFORMATION_SCHEMA`特定于线程池插件的表：[第 26.5 节，“信息\_SCHEMA 线程池表”](thread-pool-information-schema-tables.html)

-   相关信息`INFORMATION_SCHEMA`特定于`连接控制`插入：[第 26.6 节，“信息\_SCHEMA 连接控制表”](connection-control-information-schema-tables.html)

-   对经常被问到的问题的答案`INFORMATION_SCHEMA`数据库：[第 A.7 节，“MySQL 8.0 常见问题解答：信息\_架构”](faqs-information-schema.html)

-   `INFORMATION_SCHEMA`查询和优化器：[第 8.2.3 节，“优化信息\_SCHEMA 查询”](information-schema-optimization.html)

-   校对的影响`INFORMATION_SCHEMA`比较：[第 10.8.7 节，“在 INFORMATION 中使用排序规则\_SCHEMA 搜索”](charset-collation-information-schema.html)
