Db::getTables() 不带表注释,需用 SHOW TABLE STATUS 或 information_schema.TABLES;SHOW COLUMNS 缺失 COLUMN_COMMENT 等关键字段信息,推荐用 information_schema.COLUMNS 查全元数据,并注意字符集、NULL 判定及 ORDINAL_POSITION 排序。

Db::getTables() 能拿到表名,但不带注释;SHOW TABLE STATUS 和 information_schema.TABLES 才能查到表级注释——这是绝大多数人卡住的第一步。
为什么直接用 Db::query('SHOW COLUMNS FROM xxx') 不够用
它只返回字段基础定义(Field、Type、Null等),但缺失关键业务信息:COLUMN_COMMENT 字段注释、字符集、是否为生成列、默认值表达式(如 CURRENT_TIMESTAMP)都不在结果里。
更麻烦的是,ThinkPHP 5.1+ 的 Db::query() 默认不返回关联索引,fetch_assoc 行为需手动处理,否则遍历时容易漏字段或键名错位。
用 information_schema 查全字段元数据(推荐)
MySQL 的 information_schema.COLUMNS 是最稳定、最完整的字段元数据源,尤其适合生成正式数据字典。注意三点:
-
TABLE_SCHEMA必须显式指定,不能依赖当前连接库名,否则跨库查询会出错 -
COLUMN_DEFAULT为NULL时,实际返回的是NULL值而非字符串'NULL',判空要用is_null(),别用== 'NULL' -
COLUMN_TYPE包含括号和长度(如varchar(255)),解析枚举/集合类型时需正则提取,别直接当字符串截取
ThinkPHP 6 命令行生成 Markdown 字典的实操要点
自定义命令类里别硬拼 SQL 字符串,尤其是表名带前缀时。正确做法是用 Db::getConfig('prefix') 拿前缀,再用 str_replace() 剥离,避免 SHOW CREATE TABLE `pre_user` 这种写法被防火墙或安全插件拦截。
立即学习“PHP免费学习笔记(深入)”;
生成 Markdown 表格时,字段顺序建议按 ORDINAL_POSITION 排,不是按查询返回顺序——后者在某些 MySQL 版本中不稳定。示例片段:
$sql = "SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT, ORDINAL_POSITION
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION";
$fields = Db::query($sql, [$dbName, $tableName]);
中文注释乱码?检查三处字符集配置
即使数据库用 utf8mb4,数据字典仍可能显示问号,问题通常不在 SQL 层:
- PHP 连接参数没设
charset=utf8mb4(ThinkPHP 配置里database.charset必须显式声明) - MySQL 服务端的
collation_server是latin1_swedish_ci,导致information_schema元数据被转码 - 导出 HTML 时没写
<meta charset="utf-8">,浏览器按 ISO-8859-1 解析
最容易被忽略的是第二点:哪怕你的业务库全是 utf8mb4,只要 information_schema 自身的 collation 不匹配,COLUMN_COMMENT 就是乱码——这个坑在阿里云 RDS 和腾讯云 CVM 上高频出现。



















