28.1 简介
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 中使用排序”。
INFORMATION_ SCHEMA 作为 显示语句的替代方法
语句SELECT ... FROM INFORMATION_ SCHEMA
旨在提供一种更一致的方式来访问 MySQL 支持的各种SHOW
语句所提供的信息(例如SHOW DATABASES
、SHOW 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_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
语句等同于一个SELECT
,用于从 INFORMATION_SCHEMA
表中检索信息。对于显示默认数据库的SHOW
语句,如果您省略了 FROM
子句,您可以通过在查询中添加一个 db_name
AND TABLE_SCHEMA = SCHEMA()
条件来选择默认数据库的信息,从而检索来自 INFORMATION_SCHEMA
表中的信息。
这些部分讨论了关于 INFORMATION_SCHEMA
的其他主题:
-
关于
InnoDB
存储引擎特定的INFORMATION_SCHEMA
表信息:第 28.4 节,“INFORMATION_SCHEMA InnoDB 表” -
关于
INFORMATION_SCHEMA
表的信息,特定于线程池插件:第28.5节,“INFORMATION_SCHEMA Thread Pool Tables” -
关于
INFORMATION_SCHEMA
表的信息,特定于连接控制插件:第28.6节,“INFORMATION_SCHEMA Connection-Control Tables” -
常见问题的答案,关于
INFORMATION_SCHEMA
数据库:第A.7节,“MySQL 8.4 FAQ: INFORMATION_SCHEMA” -
INFORMATION_SCHEMA
查询和优化器:第10.2.3节,“Optimizing INFORMATION_SCHEMA Queries” -
字符集对
INFORMATION_SCHEMA
比较的影响:第12.8.7节,“Using Collation in INFORMATION_SCHEMA Searches”