小编典典

使用DB2 LIKE运算符进行奇怪的长度限制

sql

我发现DB2 v9.7和SQLLIKE运算符有一个有趣的问题。看一下这个:

-- this works and returns one record
select 1 
from SYSIBM.DUAL
where 'abc' like concat('a', 'bc')

-- this doesn't work
select 1 
from SYSIBM.DUAL
where 'abc' like concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))

-- It causes this error (from JDBC):
-- No authorized routine named "LIKE" of type "FUNCTION" having compatible 
-- arguments was found.. SQLCODE=-440, SQLSTATE=42884, DRIVER=4.7.85

我已经试过了长度,似乎只要长度加起来大于,就会出现问题4000。如果我将整个串联的字符串“截断”到一定长度4000,问题就消失了:

select 1 
from SYSIBM.DUAL
where 'abc' like 
  cast(concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))
  as varchar(4000))

有趣的是,它似乎确实与CONCAT功能有关。以下内容也适用:

select 1 
from SYSIBM.DUAL
where 'abc' like cast('abc' as varchar(32672))

有没有人遇到过这样的问题?这是DB2中的错误吗?还是一些未记录的限制?注意:我在这里发现了类似的问题:

https://www-304.ibm.com/support/docview.wss?uid=swg1PM18687

鉴于另一款IBM产品在2010年为此问题提供了解决方法,我想这并不是一个真正的错误,否则它会同时得到解决吗?


阅读 305

收藏
2021-05-23

共1个答案

小编典典

编辑: 啊哈!

在信息中心搜索有关VARCHARs的其他知识时,我在字符数据类型页面上发现了这个精妙的信息:

以VARCHAR作为参数的SYSFUN模式中的函数将不接受长度超过4000字节的VARCHAR。但是,这些功能中的许多功能还具有接受CLOB(1M)的替代签名。对于这些功能,用户可以显式地将大于4000个VARCHAR字符串转换为CLOB,然后将结果重新转换为所需长度的VARCHAR。

因此,它看起来像是DB2的已知“功能”。

我做了一些额外的测试,看起来上面提到的“替代方法”适用于Linux / Unix / Windows上的DB2,但不适用于大型机上的DB2。


从信息中心的“
SQL和XML限制”页面开始,如果您查看表7(第三行),它说一行的最大长度(包括表空间为4k的表空间的所有开销)为4005字节。

我的猜测是SYSIBM.DUAL在4k页大小的表空间中,这导致了您的错误。您可以检查SYSCAT.TABLESPACES,这可以确认或否认这种怀疑。

您可以通过查询获取信息,如下所示:

SELECT ts.PAGESIZE
FROM SYSCAT.TABLESPACES ts
JOIN SYSCAT.TABLES tb
  ON tb.TBSPACEID = ts.TBSPACEID
WHERE tb.TABSCHEMA = 'SYSIBM'
  AND tb.TABNAME   = 'DUAL'
2021-05-23