24.1 Introduction
INFORMATION_SCHEMA
提供对数据库元数据的访问,有关 MySQL 服务器的信息,例如数据库或 table 的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。
INFORMATION_SCHEMA 使用说明
INFORMATION_SCHEMA
是每个 MySQL 实例中的一个数据库,该位置存储有关 MySQL 服务器维护的所有其他数据库的信息。 INFORMATION_SCHEMA
数据库包含几个只读 table。它们实际上是视图,而不是基 table,因此没有与它们关联的文件,并且您不能在它们上设置触发器。另外,没有使用该名称的数据库目录。
尽管您可以使用USE语句选择INFORMATION_SCHEMA
作为默认数据库,但是您只能读取 table 的内容,而不能对它们执行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
中所有 table 的列 table,仅显示三条信息:table 的名称,其类型和存储引擎。
字符集注意事项
字符列的定义(例如TABLES.TABLE_NAME
)通常为VARCHAR(N) CHARACTER SET utf8
,其中* N
*至少为 64.MySQL 使用此字符集的默认排序规则(utf8_general_ci
)进行此类列的所有搜索,排序,比较和其他字符串操作。
由于某些 MySQL 对象 table 示为文件,因此在INFORMATION_SCHEMA
字符串列中进行搜索可能会受到文件系统区分大小写的影响。有关更多信息,请参见第 10.8.7 节“在 INFORMATION_SCHEMA 搜索中使用归类”。
INFORMATION_SCHEMA 代替 SHOW 语句
SELECT ... FROM INFORMATION_SCHEMA
语句旨在作为一种更一致的方式来提供对 MySQL 支持的各种SHOW语句(SHOW DATABASES,SHOW TABLES等)提供的信息的访问。与SHOW相比,使用SELECT具有这些优点:
-
它符合 Codd 的规则,因为所有访问都在 table 上完成。
-
您可以使用SELECT语句熟悉的语法,只需要学习一些 table 和列名。
-
实现者不必担心添加关键字。
-
您可以对
INFORMATION_SCHEMA
查询的结果进行过滤,排序,连接和转换,以转换为应用程序所需的任何格式,例如要解析的数据结构或文本 table 示形式。 -
此技术与其他数据库系统更可互操作。例如,Oracle 数据库用户熟悉 Oracle 数据字典中的查询 table。
因为SHOW是熟悉的并且被广泛使用,所以SHOW语句仍然可以替代。实际上,随着INFORMATION_SCHEMA
的实现,对SHOW进行了增强,如第 24.35 节,“ SHOW 语句的扩展”中所述。
INFORMATION_SCHEMA 和特权
对于大多数INFORMATION_SCHEMA
table,每个 MySQL 用户都有权访问它们,但是只能看到 table 中与用户具有适当访问权限的对象相对应的行。在某些情况下(例如INFORMATION_SCHEMA
ROUTINEStable 中的ROUTINE_DEFINITION
列),特权不足的用户将看到NULL
。某些 table 具有不同的特权要求;为此,在适用的 table 格说明中提到了这些要求。例如,InnoDB个 table(名称以INNODB_
开头的 table)需要PROCESS特权。
相同的特权适用于从INFORMATION_SCHEMA
选择信息并通过SHOW语句查看相同的信息。无论哪种情况,您都必须对对象具有某种特权才能查看有关该对象的信息。
Performance Considerations
从多个数据库中搜索信息的INFORMATION_SCHEMA
查询可能会花费很长时间并影响性能。要检查查询的效率,可以使用EXPLAIN。有关使用EXPLAIN输出调整INFORMATION_SCHEMA
查询的信息,请参见第 8.2.3 节“优化 INFORMATION_SCHEMA 查询”。
Standards Considerations
MySQL 中INFORMATION_SCHEMA
table 结构的实现遵循 ANSI/ISO SQL:2003 标准第 11 部分* Schemata *。我们的意图是大致符合 SQL:2003 核心功能 F021 *“基本信息模式” *。
SQL Server 2000(也遵循该标准)的用户可能会注意到强烈的相似性。但是,MySQL 省略了许多与我们的实现无关的列,并添加了特定于 MySQL 的列。这样添加的一列是INFORMATION_SCHEMA
TABLEStable 中的ENGINE
列。
尽管其他 DBMS 使用各种名称,例如syscat
或system
,但标准名称是INFORMATION_SCHEMA
。
为了避免使用标准或 DB2,SQL Server 或 Oracle 中保留的任何名称,我们更改了某些标记为“ MySQL 扩展”的列的名称。 (例如,我们在TABLEStable 中将COLLATION
更改为TABLE_COLLATION
。)请参见本文结尾处的保留字列 table:https://web.archive.org/web/20070428032454/http://www.dbazine.com/db2/db2-disarticles/gulutzan5。
INFORMATION_SCHEMA 参考部分中的约定
以下各节描述INFORMATION_SCHEMA
中的每个 table 和列。对于每一列,有三部分信息:
-
“
INFORMATION_SCHEMA
名称”table 示INFORMATION_SCHEMA
table 中列的名称。除非“备注”字段显示“ MySQL 扩展”,否则这与标准 SQL 名称相对应。 -
“备注”在适用时提供了其他信息。如果此字段为
NULL
,则 table 示该列的值始终为NULL
。如果此字段显示“ MySQL 扩展”,则该列是标准 SQL 的 MySQL 扩展。
许 Multipart 指出SHOW语句等效于INFORMATION_SCHEMA
检索信息的SELECT。对于省略了FROM db_name
子句的显示默认数据库信息的SHOW语句,通常可以通过向查询的WHERE
子句中添加AND TABLE_SCHEMA = SCHEMA()
条件来从INFORMATION_SCHEMA
table 中检索信息来选择默认数据库的信息。
Related Information
这些部分讨论了其他与INFORMATION_SCHEMA
相关的主题:
-
有关InnoDB存储引擎特定的
INFORMATION_SCHEMA
table 的信息:第 24.32 节“ INFORMATION_SCHEMA InnoDBtable” -
有关特定于线程池插件的
INFORMATION_SCHEMA
table 的信息:第 24.33 节“ INFORMATION_SCHEMA 线程池 table” -
有关
CONNECTION_CONTROL
插件特有的INFORMATION_SCHEMA
个 table 的信息:第 24.34 节,“ INFORMATION_SCHEMA 连接控制 table” -
解答有关
INFORMATION_SCHEMA
数据库的常见问题:第 A.7 节“ MySQL 5.7 常见问题解答:INFORMATION_SCHEMA” -
INFORMATION_SCHEMA
个查询和优化器:第 8.2.3 节“优化 INFORMATION_SCHEMA 查询” -
归类对
INFORMATION_SCHEMA
比较的影响:第 10.8.7 节“在 INFORMATION_SCHEMA 搜索中使用归类”