达梦大字段比较报错字符串截断-6108:字符串截断
对大字段与字符串比较,DM数据库中的mysql兼容模式,现在有一条sql,select * 没有问题,count(*)就有问题提示字符串截断,把f_pic_url <> ‘’ 去掉也没问题,f_pic_url是text类型
报错-6108:字符串截断
创建mysql兼容模式数据库
create table test1(id int,c1 text);
insert into test1 values(1,'');
insert into test1 values(2,'assdsadsadasdasdasad');
DECLARE
v_clob CLOB;
v_str VARCHAR(32767);
BEGIN
v_str := RPAD('A', 32767, 'A'); -- 最大VARCHAR长度
v_clob := v_str;
-- 追加多次,使其超过阈值
FOR i IN 1..10 LOOP
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_str), v_str);
END LOOP;
INSERT INTO test1 (id, c1) VALUES (1, v_clob);
COMMIT;
END;
/
--复现同样报错
select count(*) from test1 where C1 <>'';
--select * 查看也报错
select count(*) from test1 where C1 <>'';
--查看执行计划有隐式转换
explain select count(*) from test1 where C1 <>'';
--将不等于替换为比较长度,不再用隐式转换与''字符串比较
select count(*) from test1 where LENGTH(C1) >0;

查找官方文档与大字段比较相关的参数
ENABLE_BLOB_CMP_FLAG
是否支持大字段类型的比较。
0:不支持;
1:支持,此时 DISTINCT、ORDER BY、 分析函数和集函数支持对大字段进行处理,且当大字段跟字符串比较时,让大字段转换成字符串类型;
2:支持,此时 DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理,且兼容 MYSQL 模式下,大字段跟字符串比较时,让字符串转换成大字段类型
--查看该参数值
select para_value from SYS."V$DM_INI" WHERE para_name = 'ENABLE_BLOB_CMP_FLAG';
--修改参数值
SP_SET_PARA_VALUE(1,'ENABLE_BLOB_CMP_FLAG',2);
--重启数据库后,再次查看该参数值
select para_value from SYS."V$DM_INI" WHERE para_name = 'ENABLE_BLOB_CMP_FLAG';
--再次执行大字段比较语句
select count(*) from test1 where C1 <>'';
select * from test1 where C1 <>'';
文章
阅读量
获赞
