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