MySQL INT生成列已设为NULL,为何无法存储JSON中的null值?
MySQL JSON生成列存储NULL值报错问题
创建表结构的SQL语句如下:
CREATE TABLE participants ( id INT AUTO_INCREMENT PRIMARY KEY, puuid CHAR(36) NOT NULL, data JSON, project INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.project'))) STORED NULL, schoolCode VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.schoolCode'))) STORED, UNIQUE KEY (puuid) );
执行下述插入语句时可正常运行:
insert into participants(puuid,data) values('aasd','{"project":1}');
但执行这条插入语句时会报错:
insert into participants(puuid,data) values('aasd1','{"project":null}');
报错信息为:
Error Code: 1366. Incorrect integer value: 'null' for column 'project' at row 1
通过show columns from participants;查询确认project列允许NULL,却无法存储JSON中的null值,这是为什么?
尝试过修改生成列的定义,比如:
project INT GENERATED ALWAYS AS (COALESCE(JSON_UNQUOTE(JSON_EXTRACT(data, '$.project')), 0)) STORED NULL,
或者:
project INT GENERATED ALWAYS AS (IFNULL(JSON_UNQUOTE(JSON_EXTRACT(data, '$.project')), 0)) STORED NULL,
但两种方式均无效,目前考虑放弃生成列方案。
更新:现有两个解决方向:
- 按照@Bill Karwin的回答及评论,弃用数据库中的JSON;
- 若仍想使用JSON,可尝试@aland提供的解决方案。
内容的提问来源于stack exchange,提问作者epeleg
相关产品推荐
相关产品推荐

