注册
达梦大字段比较报错字符串截断-6108:字符串截断
专栏/技术分享/ 文章详情 /

达梦大字段比较报错字符串截断-6108:字符串截断

Captain J 2026/07/17 167 0 0
摘要

达梦大字段比较报错字符串截断-6108:字符串截断

1、问题描述

对大字段与字符串比较,DM数据库中的mysql兼容模式,现在有一条sql,select * 没有问题,count(*)就有问题提示字符串截断,把f_pic_url <> ‘’ 去掉也没问题,f_pic_url是text类型
报错-6108:字符串截断

2、问题复现

创建mysql兼容模式数据库

2.1 创建测试表

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; /

image.png

2.2 测试大字段比较(复现报错)

--复现同样报错 select count(*) from test1 where C1 <>'';

image.png

--select * 查看也报错 select count(*) from test1 where C1 <>'';

image.png

--查看执行计划有隐式转换 explain select count(*) from test1 where C1 <>'';

image.png

3、解决方案

3.1 方案一

--将不等于替换为比较长度,不再用隐式转换与''字符串比较 select count(*) from test1 where LENGTH(C1) >0;

image.png
在这里插入图片描述

3.2 方案2

查找官方文档与大字段比较相关的参数

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';

image.png

--修改参数值 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';

image.png

--再次执行大字段比较语句 select count(*) from test1 where C1 <>''; select * from test1 where C1 <>'';

image.png
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服