使用Mysql,如下表:
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;
返回
为什么它不允许 JSON 在项目中具有空值,即使它声明项目列允许空值?
除了类似以下内容之外,没有其他解决方案吗?
project INT GENERATED ALWAYS AS (COALESCE(JSON_UNQUOTE(JSON_EXTRACT(data, '$.project')), 0)) STORED NULL,
缺失的 JSON 密钥会提取为 SQL
NULL
。
mysql> select json_extract('{"project":null}', '$.xyzzy') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 1 |
+------------+
JSON
null
值不会提取到 SQL NULL
。它提取为 JSON 文档,即标量值 'null'
。
mysql> select json_extract('{"project":null}', '$.project') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 0 |
+------------+
JSON_UNQUOTE()
不会将 JSON 值 'null'
转换为 SQL NULL
。它将其转换为 SQL 字符串值 'null'
。
mysql> select json_unquote(json_extract('{"project":null}', '$.project')) is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 0 |
+------------+
您可以通过将该字符串值与
'null'
进行比较并用这种方式替换 SQL NULL 来修复它:
mysql> select nullif(json_unquote(json_extract('{"project":null}', '$.project')), 'null') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 1 |
+------------+
但这无法与JSON字符串值区分开来
'null'
:
mysql> select nullif(json_unquote(json_extract('{"project":"null"}', '$.project')), 'null') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 1 |
+------------+
基本上,JSON 与 SQL 结合起来就是一团乱麻。有如此多的边缘情况以违反直觉的方式运行,我不得不说这是多年来添加到 SQL 中的最糟糕的功能。