注册
IFNULL 函数中 JSON 与 VARCHAR 类型不兼容问题
技术分享/ 文章详情 /

IFNULL 函数中 JSON 与 VARCHAR 类型不兼容问题

诗想与论语 2026/08/07 147 0 0

# 1.问题描述:
在执行SQL语句:
drop table sys_main;
create table sys_main
(id_ int, reading_users json
);
insert into sys_main
values(1, ‘[“1”,“bddde13cd0e44c92a00dd226163d8762”,“bd3cd779b040470199fc78f7104a0a82”]’);
select main.id_,
main.reading_users, IFNULL(’[“1”,“bddde13cd0e44c92a00dd226163d8762”,“bd3cd779b040470199fc78f7104a0a82”]’, ‘[]’),
IFNULL(main.reading_users, ‘[]’),
json_length(IFNULL(main.reading_users, ‘[]’), ‘$’),

json_length(IFNULL(’[“1”,“bddde13cd0e44c92a00dd226163d8762”,“bd3cd779b040470199fc78f7104a0a82”]’, ‘[]’), ‘$’)
from sys_main main;
出现报错问题:参数不兼容
image.png
# 2.分析根本原因:
main.reading_users 是 JSON 类型,’[]’ 是 VARCHAR 字符串类型,当 IFNULL 遇到 JSON 和 VARCHAR 混合时,达梦为了"兼容"两种类型,选择返回 BLOB 类型,json_length 函数的参数要求是 JSON 类型,传 BLOB 进去,无法识别,因此会报错

# 3.解决方案:
方案1:
把 reading_users 从 JSON 类型改为VARCHER 类型,加 CHECK 约束保证存入的是合法JSON。
CREATE TABLE sys_main (
id INT,
reading_users VARCHAR(4000) CHECK (reading_users IS JSON)
);
image.png
方案2:
如果JSON数据可能超过4000字节,用 CLOB 更安全。
CREATE TABLE sys_main (
id INT,
reading_users CLOB CHECK (reading_users IS JSON)
);
image.png
方案3:
如果不想修改表结构,修改全局范围的查询,可以采用以下方案,仅改变此处查询
IFNULL(main.reading_users, ‘[]’),
修改为
json_length(IFNULL(CAST(main.reading_users AS VARCHAR), ‘[]’), ‘$’),
可达到同样的效果。
image.png

4.总结

本问题是达梦数据库在 JSON 类型与 IFNULL 结合使用时的类型系统实现缺陷,可以采用将字段类型改为VARCHER 并添加 CHECK 约束的方式,在不影响数据格式合规性的前提下,确保 JSON 相关函数的正常使用。粗体

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服