精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL JSON 類型 NOT NULL 竟無法約束 NULL 值插入?

數據庫 MySQL
正向解析 binlog 生成 SQL 看并無問題,binlog 里記錄的確實是 '' (空)值。但是通過查看線上表數據發現,在 有 JSON NOT NULL? 類型的約束下,對應的回滾 SQL 主鍵值竟然是 NULL 值! 這和 binlog 里記錄的 '' (空)值不一致。

故障現象

業務人員執行了 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'.

起初,以為是 SQL 里的反斜杠導致數據被截斷了,sed 完再導入 SQL 發現還是有問題。SQL 文件不小,表也很寬,很難檢查問題,但還是試著分析數據,發現反斜杠是對的。汗。。。

又通過報錯仔細分析對應字段 search_stats 的值,發現 JSON 字段類型回滾生成的 SQL 竟然是 '' (空)值!

  • 版本:MySQL 5.7.21
  • SQL_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
*************************** 1.row ***************************
       Table: q
Create Table: CREATE TABLE`q` (
`id` int(11) DEFAULT NULL,
`age` json NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1rowinset (0.00 sec)

# 查一下試試,也能查出來
MySQL [xuzong]> select * from q  WHERE JSON_EXTRACT(age, '$.age') IS NULL;
+----+------+
| id | age  |
+----+------+
|  1 | null |
+----+------+
1 row in set (0.0019 sec)

# update 一下試試 binlog 是怎么記錄的
MySQL [xuzong]> update q set id=2 where id=1;
Query OK, 1 row affected (0.0023 sec)
Rows matched: 1  Changed: 1  Warnings: 0

# 用 5.7.21 的 mysqlbinlog 解析出來 binlog:null 值 update 的時候 binlog 會記錄為 ''
### UPDATE `xuzong`.`q`
### WHERE
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='' /* JSON meta=4 nullable=0 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='' /* JSON meta=4 nullable=0 is_null=0 */

問題處理

查到是字段兼容性問題就好處理了,方法如下:

新建一個庫,建議一個同表結構的表,將 JSON 字段改寫為 TEXT 字段,然后將回滾 SQL 導入。再 UPDATE 修改 '' (空)值為 {},然后再修改為 JSON 字段。業務判斷數據是否正確,INSERT ... SELECT ... 寫入回原表。

這樣就解決了。。。

后續測試

其他版本 MySQL 是否存在同樣的問題?親測 5.7.35 和 5.7.44 也同樣存在,這里不再概述。

但是用 MySQL 8.0 的 mysqlbinlog 去解析 binlog,記錄為 null。

測試 VARCHAT 類型

MySQL [xuzong]> create table j (id int , age varchar(20));
Query OK, 0 rows affected (0.01 sec)

MySQL [xuzong]> insert into j values (1,NULL);
Query OK, 1 row affected (0.01 sec)

MySQL [xuzong]> select * from j;
+------+------+
| id   | age  |
+------+------+
|    1 | NULL |
+------+------+
1 row in set (0.01 sec)

MySQL [xuzong]> alter table j modify age varchar(20) not null;
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 1

MySQL [xuzong]>  show Warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'age' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

MySQL [xuzong]> select * from j;
+------+-----+
| id   | age |
+------+-----+
|    1 |     |
+------+-----+
1 row in set (0.00 sec)

這樣看的 VARCHAR 會自動轉換為空值。

SQL_MODE

# 再執行復現操作就報錯了,所以還是建議線上開啟嚴格模式的。
set global sql_mode=deafult;

用 ibd2sql 解析一下 ibd 文件,發現數據是正確的:

[root@nvm-22vdnhahrwnq37 ibd2sql-main]# python3 main.py ../mysql4223/xuzong/j.ibd --sql --ddl
CREATE TABLE IF NOT EXISTS `xuzong`.`j`(
    `id` int NULL,
    `age` json NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ;
INSERT INTO `xuzong`.`j` VALUES (2, '{}');

總結

  1. 線上修改表結構,一定要先備份數據,然后在測試環境上修改表結構,測試通過后再上線。
  2. 修改表結構時,一定要注意數據類型的變化,特別是 JSON、BLOB 等特殊類型的變化。
  3. 建議線上開啟 SQL_MODE 嚴格模式,避免出現一些意想不到的問題。
  4. 本次問題不影響線上數據以及主從復制,理論上來說只是 MySQL 5.7 版本 mysqlbinlog 的問題,以及違反了非空約束。

責任編輯:武曉燕 來源: 愛可生開源社區
相關推薦

2022-05-08 18:18:40

JDKValueHashMap

2022-01-27 07:02:52

JavaHashMap單線程

2023-10-26 14:30:05

MySQLInnoDB

2010-05-31 15:23:02

MySQL數據庫NUL

2025-10-09 09:32:29

MySQL數據數據庫

2010-09-28 11:48:36

SQL NULL值

2023-05-10 16:15:58

javaScript算法開發

2024-06-06 08:10:30

多線程Mapnull

2017-09-05 09:02:06

Oraclenot null優化

2025-11-19 08:26:19

MySQLNULL空值字段

2015-07-20 17:05:38

SQL ServerNULL值

2025-01-20 07:10:00

LambdaJavanull

2022-09-13 08:33:05

SQLNULL三值邏輯

2020-07-09 10:15:55

空值Bug語言

2009-08-24 13:52:04

C# 泛型約束

2018-02-06 08:32:09

MySQLNull程序員

2021-06-07 07:59:29

MySQL數據庫 Get

2024-12-09 09:20:00

MySQLNULL 值

2010-09-17 10:24:47

SQL中IS NULL

2010-11-26 13:40:58

MySQL空字符串
點贊
收藏

51CTO技術棧公眾號

亚洲高清视频一区二区| 日本中文字幕久久看| 国产精品99精品无码视亚| 小早川怜子一区二区三区| 色欲久久久天天天综合网| 视频一区二区不卡| 久久精品亚洲94久久精品| 久久久高清视频| 国产91亚洲精品久久久| 亚洲最大的成人av| 日韩久久久久久久久久久久久| 国产毛片一区二区三区va在线| 一区二区动漫| 久久这里有精品视频| 短视频在线观看| 清纯唯美激情亚洲| 欧美三电影在线| 男女视频网站在线观看| 免费在线看黄| 国产亚洲福利社区一区| 成人欧美一区二区三区视频xxx | 真实乱偷全部视频| 成人日韩精品| 精品久久久中文| 草草草视频在线观看| 91在线看黄| 久久久不卡网国产精品一区| 国产日韩欧美综合精品| 91亚洲精品国偷拍自产在线观看| 午夜一级久久| 久久久视频精品| 东方av正在进入| 日韩欧美一区二区三区在线视频| 亚洲毛片在线观看| 国产污在线观看| 蜜桃精品视频| 91精品国产aⅴ一区二区| 国内自拍视频一区| av电影一区| 午夜精品久久久久| 国产一区二区片| 岛国中文字幕在线| 国产精品灌醉下药二区| 色女孩综合网| 日韩国产精品毛片| 精品人妻久久久久一区二区三区| 欧美a一区二区| 奇米四色中文综合久久| 800av免费在线观看| 影音先锋亚洲电影| 欧美激情在线观看| 久久精品女人毛片国产| 一区在线观看| 97色在线观看| 4438国产精品一区二区| 久久国产精品99国产| 日本一本a高清免费不卡| 日本中文字幕久久| 久久中文在线| 国产精品久久久久久一区二区| 在线视频精品免费| 美女www一区二区| 成人网欧美在线视频| 国产夫妻性生活视频| 国产成人精品影视| 国产精品午夜av在线| 亚洲欧洲视频在线观看| 国产午夜精品在线观看| 丝袜美腿玉足3d专区一区| 在线播放日本| 一区二区三区日韩精品| 亚洲熟妇无码一区二区三区导航| 久久不射影院| 日韩欧美高清在线视频| 欧美黄色性生活| 成人av在线播放| 欧美成人女星排名| 亚洲av无码国产精品久久| 国产真实有声精品录音| 久久精品免费电影| 国产精品99re| 久久精品91| 91亚洲国产精品| 五月天激情开心网| 亚洲国产精品精华液2区45| 老司机av福利| 午夜伦理福利在线| 欧美精品丝袜久久久中文字幕| 亚洲欧美一区二区三区不卡| 美女一区二区在线观看| 在线看片不卡| 中文字幕少妇一区二区三区| 性欧美疯狂猛交69hd| 国产精品综合色区在线观看| 国产乱肥老妇国产一区二| 风流少妇一区二区三区91| 国产蜜臀av在线一区二区三区| 日本丰满少妇黄大片在线观看| 岛国av免费在线观看| 欧美日韩小视频| 国产精品一区二区人妻喷水| 久久中文亚洲字幕| 91国产一区在线| 国产麻豆一精品一男同| 91免费在线视频观看| 三级网在线观看| 日本免费一区二区三区四区| 日韩欧美专区在线| 黄色片在线观看免费| 99亚洲精品| 91影视免费在线观看| 国产精品四虎| 亚洲第一福利一区| 欧美一级小视频| 九九在线精品| 久久久在线视频| 国产视频手机在线| 中文成人综合网| 成人在线观看黄| 米奇精品关键词| 久久亚洲一区二区三区四区五区高 | 欧美 日韩精品| 中文无码日韩欧| 色系列之999| 激情五月婷婷网| 99re在线精品| 国内自拍中文字幕| 亚洲精品成人一区| 国产一区二区三区在线播放免费观看 | 亚洲一级片网站| 蜜桃一区二区三区| 97精品视频在线播放| 亚洲精品成人区在线观看| 亚洲欧洲综合另类| 在线视频观看一区二区| 免费国产羞羞网站美图| 亚洲视频福利| 亚洲一区中文字幕| 国产福利视频在线| 制服丝袜av成人在线看| 999福利视频| 美女脱光内衣内裤视频久久影院| 日韩.欧美.亚洲| 中国字幕a在线看韩国电影| 亚洲激情第一页| 日韩免费不卡视频| 成人美女视频在线观看| 国产精品一色哟哟| 国产精品xxxav免费视频| 欧美激情亚洲另类| 亚洲国产成人一区二区| 洋洋av久久久久久久一区| 亚洲少妇中文字幕| 99成人在线| 久久人人九九| 校园春色亚洲色图| 中文字幕精品网| 国产伦精品一区二区三区四区 | 精品自拍视频| 日韩亚洲综合在线| 99精品在线视频观看| 又紧又大又爽精品一区二区| 国产欧美视频一区| 亚洲欧美日韩一区在线观看| 欧美三级网色| 久久久久黄色| 欧美国产日韩一区二区三区| 欧美一级性视频| 欧美日韩亚洲国产一区| a级在线免费观看| 久久国产精品第一页| 手机在线视频你懂的| 亚洲一二av| 69av在线播放| 高清毛片在线看| 91精品国产入口| 日韩精品一区二区av| 久久久蜜臀国产一区二区| 久久久久久蜜桃一区二区| 午夜激情一区| 久久综合给合久久狠狠色| 亚洲成av在线| 九九热这里只有精品免费看| 天天干天天摸天天操| 色呦呦国产精品| 亚洲精品999| 国产真实乱人偷精品视频| 91麻豆高清视频| 在线观看国产一级片| 极品裸体白嫩激情啪啪国产精品| 免费久久99精品国产自| 精品一区二区三区亚洲| 26uuu亚洲国产精品| www.91在线| 精品免费日韩av| 国产一区二区视频网站| 自拍偷拍国产亚洲| 99re久久精品国产| 激情文学综合丁香| 国产1区2区在线| 91精品婷婷色在线观看| 精品欧美日韩在线| 国产一区二区三区黄网站| 5566日本婷婷色中文字幕97| 成人免费高清| 国产午夜精品全部视频播放| 精品人妻无码一区二区| 日本韩国欧美一区二区三区| 毛片a片免费观看| 国产精品女上位| yy6080午夜| 国产成人精品影视| 奇米视频888| 久久亚洲精品伦理| 97超碰免费观看| 欧美日韩在线网站| 久久精品日产第一区二区三区精品版| 国产精品美女久久久久| 国产成人精品优优av| 蜜臀久久精品| 久久久久久久电影一区| 国产美女福利在线| 国产一区av在线| 国产一区2区| 99九九视频| 四虎视频在线精品免费网址| 日本91av在线播放| 超碰激情在线| 国语对白做受69| 曰本三级在线| 欧美超级乱淫片喷水| 天天综合视频在线观看| 一区二区三区美女xx视频| 天堂在线一二区| 亚洲国产高清自拍| 欧美一级视频免费| 亚洲国产黄色片| 色网站免费观看| 亚洲国产小视频| 亚洲国产综合一区| 欧美一区二区精美| 国产农村妇女毛片精品久久| 精品美女一区| 久久免费国产视频| 日本三级韩国三级欧美三级| 美日韩丰满少妇在线观看| 老司机在线视频二区| 精品国产欧美一区二区五十路| 69视频在线观看| 日韩中文字幕欧美| 欧美被日视频| 操91在线视频| av黄色在线| 久久久在线观看| 午夜不卡影院| 国产精品视频成人| 欧美高清影院| 亚洲影院高清在线| 91精品国产自产在线丝袜啪| 国产精品二区三区四区| eeuss国产一区二区三区四区| 成人欧美一区二区| 欧美午夜寂寞| 美女亚洲精品| 欧美限制电影| 在线国产99| 欧美成人日韩| 国产精品专区在线| 久久精品首页| 手机免费看av网站| 粉嫩av一区二区三区粉嫩| 亚洲国产精品无码久久久久高潮| 久久综合色天天久久综合图片| 中文字幕网站在线观看| 国产精品电影院| 国产第一页在线播放| 色综合久久天天| 亚洲影视一区二区| 精品美女在线播放| 九色在线观看| 久久中文字幕在线视频| gogo高清午夜人体在线| 国产99久久久欧美黑人| 成人豆花视频| 欧美极品一区二区| 亚洲精品a级片| 91传媒久久久| 久久99久国产精品黄毛片色诱| 中文字幕亚洲日本| 国产午夜一区二区三区| 黄页网站免费观看| 色香蕉成人二区免费| 99久久精品日本一区二区免费| 亚洲黄页网在线观看| 欧洲日本在线| 欧美专区在线观看| www.久久99| 欧美一区二区影视| 欧美片第1页综合| aaaaaa亚洲| 成人午夜激情在线| 国产精品一区二区亚洲| 性感美女极品91精品| 国产精品福利电影| 日韩精品丝袜在线| 午夜小视频福利在线观看| 国产精品91视频| 加勒比久久高清| 久久99国产精品一区| 天堂精品中文字幕在线| 日本50路肥熟bbw| 亚洲欧美国产三级| 免费在线观看av的网站| 亚洲国产精品久久精品怡红院| 精品国产丝袜高跟鞋| 国产精品精品视频一区二区三区| 国产香蕉精品| av一区二区三区免费观看| 久久精品国产精品亚洲综合| 国产 欧美 在线| 欧美日韩国产区| 蜜桃视频久久一区免费观看入口 | 在线免费观看成年人视频| 一区二区三区日韩在线观看| 91国偷自产中文字幕久久| 亚洲性生活视频| 成人小电影网站| 久久福利电影| 99国产精品久久久久久久| 一级全黄裸体片| 有码一区二区三区| 国产精品一区二区av白丝下载 | 正在播放一区| 久久福利资源站| 免费91在线观看| 欧美探花视频资源| 国产视频在线看| 国产999精品| 蜜桃国内精品久久久久软件9| 欧美视频在线播放一区| 99免费精品视频| 国产精品第9页| 日韩精品免费视频| 性欧美又大又长又硬| 鲁片一区二区三区| 久久精品三级| 91精品国自产在线| 欧美三级韩国三级日本一级| eeuss影院在线播放| 国产美女搞久久| 国产电影一区二区在线观看| 久久6免费视频| 一区二区三区蜜桃| 蜜臀av中文字幕| 91精品国产99| 精品大片一区二区| 日本久久久久久久久久久久| 国产精品另类一区| 国产精品一区二区黑人巨大| 欧美成人免费播放| 激情av综合| 四虎永久在线精品无码视频| 国产午夜精品一区二区| 亚洲视频久久久| 欧美大学生性色视频| 国产精品毛片久久久| 韩国日本在线视频| 国产精品久久久久影院色老大 | 天堂网视频在线| 日韩在线欧美在线国产在线| 精品欧美视频| 久久久亚洲精品无码| 国产亚洲综合色| 国产美女明星三级做爰| 欧美激情第6页| 亚洲制服欧美另类| 午夜久久福利视频| 亚洲高清不卡在线| 精品亚洲综合| 亚洲一区二区三| 亚洲在线国产日韩欧美| 东京热无码av男人的天堂| 日韩视频中午一区| 在线免费日韩片| 男人天堂成人网| 91视频一区二区| 国产一区二区在线视频聊天| 久久人人爽人人| 欧美色婷婷久久99精品红桃| 无套白嫩进入乌克兰美女| 红桃av永久久久| 黄av在线播放| 欧洲高清一区二区| 成人在线视频一区| 性色av一区二区三区四区| 久久久噜噜噜久久| 日韩一区二区三区免费播放| 日本69式三人交| 91麻豆精品国产91久久久久| 网友自拍亚洲|