最稳妥方式是查询 information_schema.columns 并严格指定 table_schema 和 table_name,否则可能返回空或全库所有列;各数据库中 table_schema 含义不同:postgresql 为 schema 名(如 'public'),mysql 为数据库名,sql server 常用 'dbo'。

怎么查表的所有列名和类型(标准SQL写法)
直接查 INFORMATION_SCHEMA.COLUMNS 是跨数据库最稳妥的方式,但必须指定 TABLE_SCHEMA 和 TABLE_NAME,否则可能返回空或全库所有列——很多人漏写 WHERE 条件,结果跑出几千行。
标准写法示例:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND TABLE_SCHEMA = 'public';
注意点:
-
TABLE_SCHEMA在 PostgreSQL 中通常是'public';MySQL 里对应的是数据库名(如'myapp');SQL Server 则常用'dbo' - 列名大小写敏感取决于数据库配置,MySQL 默认不区分,PostgreSQL 默认转小写,建议统一用小写字符串匹配
- 如果表在非默认 schema 下(比如 PostgreSQL 的
auth.users),TABLE_SCHEMA必须写成'auth',不能省略
MySQL里查列信息为什么总少几列
MySQL 的 INFORMATION_SCHEMA.COLUMNS 默认只返回当前用户有权限查看的列。如果你用的是低权限账号(比如只给了 SELECT),而某些列设置了列级权限(GRANT SELECT(id, name) ON t TO u),那么没授权的列就不会出现在结果里。
临时验证方法:
- 换用
root或高权限账号重试 - 改用
SHOW COLUMNS FROM users;——它不走权限过滤,但只返回基础字段,不含默认值或字符集等细节 - 检查是否启用了
column_statistics(MySQL 8.0+),个别旧版本 bug 会导致部分列元数据缺失
PostgreSQL中COLUMN_DEFAULT显示为nextval('xxx'),怎么拿到真实默认值
COLUMN_DEFAULT 字段存的是表达式文本,不是计算后的值。遇到 nextval('users_id_seq'::regclass) 这种,说明是序列,默认值本身没有“固定值”,每次插入才生成。
想确认是否真有默认逻辑,可以:
- 查
pg_get_expr(d.adbin, d.adrelid)配合pg_attrdef表,但太重,日常没必要 - 更实用的是看
IS_NULLABLE+COLUMN_DEFAULT组合:如果IS_NULLABLE = 'NO'且COLUMN_DEFAULT为空,说明该列必须显式赋值 - 对时间戳类默认(如
now()、current_timestamp),COLUMN_DEFAULT就是原样字符串,可直接识别
为什么在SQL Server里查不到列注释
INFORMATION_SCHEMA.COLUMNS 在 SQL Server 中不包含列描述(即 MS_Description 扩展属性)。这是标准视图的固有限制,不是你写错了。
要获取注释,得连查系统视图:
SELECT
c.name AS COLUMN_NAME,
t.name AS DATA_TYPE,
ep.value AS [DESCRIPTION]
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT JOIN sys.extended_properties ep
ON ep.major_id = c.object_id AND ep.minor_id = c.column_id AND ep.name = 'MS_Description'
WHERE c.object_id = OBJECT_ID('users');
关键提醒:
-
sys.extended_properties只存显式用sp_addextendedproperty添加的注释,没加过就为空 - 别试图用
INFORMATION_SCHEMA视图兼容所有需求——它本就不设计承载 SQL Server 特有元数据 - 如果项目里混用多种数据库,建议把“查注释”逻辑单独抽出来按方言处理,别硬塞进一个通用查询
INFORMATION_SCHEMA 的访问粒度。查不出东西,先盯住这两点。










