首页/数据/数据库速查/SHOW WARNINGS 与 SHOW ERRORS 获取细节

SHOW WARNINGS 与 SHOW ERRORS 获取细节

语句执行成功但结果异常时,用 SHOW WARNINGS 看截断、隐式转换等提示;出错后用 SHOW ERRORS 拿到精确定位。

数据库速查数据更新于 2026-10-13

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 / ErrorError 说明当前语句未生效,Warning 说明生效但结果被改写
CodeMySQL 错误号,如 1265 截断、1292 日期非法配合官方错误码手册查语义,比读 Message 更可靠
Message人类可读描述,含库表列名跨版本文案会变,脚本匹配请用 Code 而非文本
在 mysql 命令行里执行完语句要立刻查看,因为后续任意一条语句都会覆盖告警缓冲区;图形客户端多数默认不展示告警,需要手动执行语句或打开「显示告警」开关。
严格模式(STRICT_TRANS_TABLES)下很多告警会直接升级为错误并回滚语句,判断行为前先确认 sql_mode;这也是同一段 SQL 在开发库正常、生产库报错的最常见原因。

易错点

  • 批量作业只看命令是否返回成功、不看告警数,导致截断数据静默入库,事后对账才发现字段缺失
  • 把 SHOW WARNINGS 当历史日志:它只保留最近一条语句,中间隔了任何一条查询都会丢失现场
  • 用 Message 文本做告警过滤:不同版本小版本措辞会调整,应该匹配 Code
  • 在严格模式下仍按「截断会变告警」的经验排查:此时语句直接失败并回滚,需要先看 sql_mode
  • 只在主库看告警,忽略从库重放时的同类告警:ROW 格式下从库按行重放,行为可能与主库语句级执行不同

数据来源与参考

  • MySQL 8.0 Reference Manual: SHOW WARNINGS Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌