SHOW WARNINGS 是什么
SHOW WARNINGS 与 SHOW ERRORS 是 MySQL 的会话级诊断语句,用来查看当前会话上一条语句产生的告警或错误明细。非严格模式下,数据被截断、隐式类型转换、除零、字符集不兼容这类问题不会让语句失败,细节全部挂在告警里;只有主动执行 SHOW WARNINGS 才能看到 Level、Code、Message 三列全文。
基本信息
| 适用版本 | MySQL 5.7 / 8.0、MariaDB 10.x |
|---|---|
| 语法 | SHOW WARNINGS [LIMIT n] / SHOW ERRORS [LIMIT n] |
| 计数 | SHOW COUNT(*) WARNINGS,可用 @@warning_count 读取 |
| 保留范围 | 仅当前会话最近一条语句,下一条语句会覆盖 |
| 权限要求 | 普通用户即可,无需额外权限 |
典型使用场景
- 批量导入后核对结果:数据文件导入返回 0 错误但存在截断,靠告警数判断是否真的完整
- 排查「值被悄悄改掉」:字符串长度超列宽、日期格式非法被转成 0000-00-00
- 应用层封装写入流程时,把 warning_count 纳入日志,避免问题被静默吞掉
- 升级或改 sql_mode 后回归验证:同一批 SQL 是否出现新的告警类型
- 定位存储过程内部语句的问题:调用后立即在同一会话查看告警
使用示例
使用示例
SET sql_mode = ''; # 关掉严格模式便于观察告警
CREATE TABLE t (v VARCHAR(3), n INT);
INSERT INTO t VALUES ('abcdef', 1); # 超长被截断,语句仍成功
SHOW WARNINGS; # Level=Warning Code=1265 说明截断
SELECT 1/0; # 除零:结果为 NULL
SHOW WARNINGS LIMIT 5; # 汇总告警,按需限制条数
SELECT @@warning_count; # 脚本里判断是否为零更省事
SHOW ERRORS; # 只取错误级信息输出逐列读法
| 列 | 含义 | 关注点 |
|---|---|---|
| Level | 级别:Note / Warning / Error | Error 说明当前语句未生效,Warning 说明生效但结果被改写 |
| Code | MySQL 错误号,如 1265 截断、1292 日期非法 | 配合官方错误码手册查语义,比读 Message 更可靠 |
| Message | 人类可读描述,含库表列名 | 跨版本文案会变,脚本匹配请用 Code 而非文本 |
在 mysql 命令行里执行完语句要立刻查看,因为后续任意一条语句都会覆盖告警缓冲区;图形客户端多数默认不展示告警,需要手动执行语句或打开「显示告警」开关。
严格模式(STRICT_TRANS_TABLES)下很多告警会直接升级为错误并回滚语句,判断行为前先确认 sql_mode;这也是同一段 SQL 在开发库正常、生产库报错的最常见原因。