参考官方文档:
24.1 Introductiondev.mysql.com
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;
说明:该语句请求数据库db5中所有表的列表,仅显示三条信息:表的名称,类型和存储引擎。
字符集条件
字符列的定义(例如,TABLES.TABLE_NAME)通常是VARCHAR(N)CHARACTER SET utf8,其中N至少为64.MySQL使用此字符集的默认排序规则(utf8_general_ci)进行搜索,排序,比较和 这些列上的其他字符串操作。
由于某些MySQL对象表示为文件,因此INFORMATION_SCHEMA字符串列中的搜索可能会受到文件系统区分大小写的影响。
INFORMATION_SCHEMA作为SHOW语句的替代
SELECT ... FROM INFORMATION_SCHEMA语句旨在提供对MySQL支持的各种SHOW语句(SHOW DATABASES,SHOW TABLES等)提供的信息的访问的更一致的方法。 与SHOW相比,使用SELECT具有以下优点:
- 它符合Codd的规则,因为所有访问都是在表上完成的。
- 您可以使用熟悉的SELECT语句语法,只需要了解一些表名和列名。
- 实现者无需担心添加关键字。
- 您可以将INFORMATION_SCHEMA查询的结果过滤,排序,连接和转换为应用程序所需的任何格式,例如数据结构或要解析的文本表示。
- 此技术可与其他数据库系统更具互操作性。 例如,Oracle数据库用户熟悉在Oracle数据字典中查询表。
因为SHOW很熟悉并且被广泛使用,所以SHOW语句仍然是另一种选择。
INFORMATION_SCHEMA 和权限
每个MySQL用户都有权访问这些表,但只能看到用户具有适当访问权限的对象的相对应的行。 在某些情况下(例如,INFORMATION_SCHEMA ROUTINES表中的ROUTINE_DEFINITION列),权限不足的用户会看到NULL。 这些限制不适用于InnoDB表; 只有PROCESS权限才能看到它们。
相同的权限适用于从INFORMATION_SCHEMA中选择信息和通过SHOW语句查看相同的信息。 在任何一种情况下,您都必须拥有对象的某些权限才能查看有关它的信息。
性能注意事项
INFORMATION_SCHEMA查询从多个数据库中搜索信息可能需要很长时间并影响性能。 要检查查询的效率,可以使用EXPLAIN。 有关使用EXPLAIN输出调整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。)
INFORMATION_SCHEMA章节中的约定
之后的部分描述了INFORMATION_SCHEMA中的每个表和列。 对于每列,有三块信息:
- “INFORMATION_SCHEMA Name”表示INFORMATION_SCHEMA表中列的名称。 除非“Remarks”字段显示“MySQL extension”,否则这对应于标准SQL名称。
- “SHOW Name”表示最近的SHOW语句中的等效字段名称(如果有)。
- “ Remarks”提供了适用的其他信息。 如果此字段为NULL,则表示该列的值始终为NULL。 如果此字段显示“MySQL extension”,则该列是标准SQL的MySQL扩展。