怎么查 MySQL 表中每个字段的数据类型
直接查
INFORMATION_SCHEMA.COLUMNS是最可靠的方式,它不依赖客户端工具或表结构缓存,返回的是服务端真实元数据。
常用写法:
SELECT column_name, data_type, character_maximum_length, numeric_precision, numeric_scale, is_nullable, column_default FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'your_db_name' AND table_name = 'your_table_name' ORDER BY ordinal_position;
data_type是核心字段,如
varchar、
int、
datetime
character_maximum_length对
varchar有效,但对
text类型返回
NULL
numeric_precision和
numeric_scale对
decimal(10,2)这类才非空
is_nullable比看
DESCRIBE输出里的
Null列更准确(尤其涉及生成列或默认值时)
DESCRIBE 和 SHOW COLUMNS 的区别与风险
这两个命令看起来快,但容易掩盖细节,不适合做数据类型审计。
DESCRIBE table_name和
SHOW COLUMNS FROM table_name返回格式一致,但不显示
collation、
generation_expression或是否为隐藏生成列 当字段有表达式默认值(如
DEFAULT (json_length(body))),
DESCRIBE的
Default列可能为空或显示不全 MySQL 8.0+ 中若字段是
STORED GENERATED,
SHOW COLUMNS会把类型显示为
virtual或漏掉生成逻辑,而
INFORMATION_SCHEMA能查到
generation_expression和
is_generated
JSON 类型和新类型(如 POINT、ENUM)怎么识别
MySQL 的扩展类型在元数据里有明确标识,但部分客户端或 ORM 可能误判。
json类型的
data_type就是
json,不是
longtext—— 即使底层存储类似,语义和校验完全不同
enum和
set的
column_type字段(非
data_type)才包含完整枚举值,例如
enum('on','off');需查 COLUMN_TYPE而非
DATA_TYPE空间类型如
POINT、
POLYGON的
data_type是
geometry,具体子类型得看
column_type或
udt_name(后者在较新版本中可用)
用 SELECT ... INTO OUTFILE 导出类型定义时要注意什么
如果要批量分析多个表的类型分布(比如统计
varchar(255)是否滥用),别直接导出
DESCRIBE结果。
INFORMATION_SCHEMA.COLUMNS支持
WHERE过滤和聚合,比如:
SELECT data_type, COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'prod' GROUP BY data_type导出前务必加
SET SESSION group_concat_max_len = 1000000,否则长
ENUM定义会被截断 注意字符集:查询结果若含中文注释(
column_comment),确保连接字符集是
utf8mb4,否则注释乱码会导致类型判断误读 实际查字段类型这件事,真正复杂的地方不在语法,而在“哪个字段代表真实语义”。
DATA_TYPE看似简单,但碰上
GENERATED、
JSON、
ENUM或分区表隐藏字段,必须交叉核对
COLUMN_TYPE、
EXTRA和
IS_GENERATED才算闭环。
