当前位置: 当前位置:首页 >人工智能 >MySQL JSON 类型 NOT NULL 竟无法约束 NULL 值插入? 正文

MySQL JSON 类型 NOT NULL 竟无法约束 NULL 值插入?

2025-11-04 07:41:30 来源:多维IT资讯作者:IT科技类资讯 点击:877次
故障现象

业务人员执行了 DELETE 操作,竟无导致数据误删除,法约需要数据回滚。插入通过工具回滚时,竟无发现回滚生成的法约 SQL 执行时报错:

ERROR 3140 (22032) at line 38454 in file: rollback.9591.sql: Invalid JSON text: "The document is empty." at position 0 in value for column life_band_dig_query.search_stats.

MySQL JSON 类型 NOT NULL 竟无法约束 NULL 值插入?

起初,以为是插入 SQL 里的反斜杠导致数据被截断了,sed 完再导入 SQL 发现还是竟无有问题。SQL 文件不小,法约表也很宽,插入很难检查问题,竟无但还是法约试着分析数据,发现反斜杠是插入对的。服务器租用汗。竟无。法约。插入

又通过报错仔细分析对应字段 search_stats 的值,发现 JSON 字段类型回滚生成的 SQL 竟然是  (空)值!

版本:MySQL 5.7.21SQL_MODE: 故障分析

正向解析 binlog 生成 SQL 看并无问题,binlog 里记录的确实是  (空)值。

但是通过查看线上表数据发现,在 有 JSON NOT NULL 类型的约束下,对应的回滚 SQL 主键值竟然是亿华云 NULL 值! 这和 binlog 里记录的  (空)值不一致。

正常写入 NULL 值,会触发约束报错,猜测可能是历史上有过 DDL 操作。

故障复现

将 SQL_MODE 设置为 ,退出重连。(PS:切记重连生效!)

复制MySQL [xuzong]> create table q(id int ,age varchar(200) default NULL); Query OK, 0 rows affected (0.0107 sec) MySQL [xuzong]> insert into q values(1,NULL); Query OK, 1 row affected (0.0040 sec) MySQL [xuzong]> select * from q; +----+------+ | id | age | +----+------+ | 1 | NULL | +----+------+ 1 row in set (0.0020 sec) MySQL [xuzong]> alter table q modify age json not null ; Query OK, 1 row affected, 1 warning (0.0164 sec) # 注意到这里有 Warning,感觉这种情况应该是 Error 才对。 Records: 1 Duplicates: 0 Warnings: 1 Warning (code 1265): Data truncated for column age at row 1 # 到这里就发现不对劲了,不仅有 null 值,而且还由 NULL 大写变成了小写。 MySQL [xuzong]> select * from q; +----+------+ | id | age | +----+------+ | 1 | null | +----+------+ 1 row in set (0.0020 sec) MySQL [xuzong]> show create table q \G

作者:应用开发
------分隔线----------------------------
头条新闻
图片新闻
新闻排行榜