这个专题主要讲information_schema数据库下的一些表

如无特殊说明数据库版本为MySQL 5.7.26


## 1. COLUMNS

该表显示表中列的信息

有如下栏位

- TABLE_CATALOG 包含列的表所属的目录的名称,该值总是def
- TABLE_SCHEMA 包含列的表所属的数据库的名称。
- TABLE_NAME 包含列的表名
- COLUMN_NAME 列名
- ORDINAL_POSITION 该列在表中的位置
- COLUMN_DEFAULT 列的默认值,如果未定义或者显式的指定为NULL,则该值为NULL
- IS_NULLABLE 该列是否为空(YES/NO)
- DATA_TYPE 列的数据类型,不包含其他信息,如数据类型的精度
- CHARACTER_MAXIMUM_LENGTH 字符串类型的列的最大长度,字符为单位
- CHARACTER_OCTET_LENGTH 字符串类型的列的最大长度,字符为字节
- NUMERIC_PRECISION number类型的列的精度
- NUMERIC_SCALE number类型的列的scale
- DATETIME_PRECISION 对于日期类型的列的分数秒精度
- CHARACTER_SET_NAME 对于字符串的列,其字符集的名称
- COLLATION_NAME 对于字符串的列,其排序规则的名称
- COLUMN_TYPE列的数据类型,除了类型外可能包含其他信息,例如精度等
- COLUMN_KEY 该列是否被索引
- EXTRA 列的其他一些信息
- PRIVILEGES 你对该列所拥有的权限
- COLUMN_COMMENT 列的注释
- GENERATION_EXPRESSION 如果是生成列,这里显示用来继续其值的表达式,否则为空



接下来对上面的一些栏位做进一步的介绍

### 1.1 COLUMN_KEY

该列显示列是否被索引,其有如下可能值

- 空 代表没有被索引,或者是一个多列的非唯一的索引的次要列
- PRI 代表是主键,或者是一个多列主键的其中一个栏位
- UNI 代表是一个唯一索引的第一个列,一个唯一索引是可以有多个空值的
- MUL 代表该列是一个非唯一索引的第一个列

如果一个栏位在多个索引中,COLUMN_KEY只会显示其中优先级最高的一个,顺序为
PRI, UNI, MUL

如果表中无主键,如果一个唯一索引不可以包含空值(定义非空),该列其可能会被显示为PRI

一个复合索引如果是唯一的,该列也有可能会被显示为MUL

### 1.2 **EXTRA**

该列用于显示额外的信息

- auto_increment 代表该列有AUTO_INCREMENT属性 
- on update 对于TIMESTAMP 或 DATETIME类型的列,CURRENT_TIMESTAMP有ON UPDATE CURRENT_TIMESTAMP属性
- VIRTUAL GENERATED 或者 VIRTUAL STORED 对于生成列的一些信息


------------------------------


## 2. 实际截图

```
SELECT * FROM INFORMATION_SCHEMA.COLUMNS\G

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE 
table_name = 'innodb_table'  AND table_schema = 'test' \G

SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'innodb_table'  AND table_schema = 'test';

```

[image:807 size:orig]







或者

```
SHOW COLUMNS from innodb_table from test ;
```

show 命令只显示该表中一些栏位

第一个from后是表名,第二from后是数据库名称

也可使用如下命令显示更多栏位

```
SHOW FULL COLUMNS from innodb_table from test ;
```

[image:808 size:orig]



## 3. 参考链接


[https://dev.mysql.com/doc/refman/5.7/en/columns-table.html](https://dev.mysql.com/doc/refman/5.7/en/columns-table.html)