DB2 LIKE运算符的奇怪长度限制

Luk*_*der 4 sql db2 varchar casting sql-like

我在DB2 v9.7和SQL LIKE运算符中发现了一个有趣的问题.看一下这个:

-- 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
Run Code Online (Sandbox Code Playgroud)

我玩过各种长度,似乎只要长度加起来就会出现问题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))
Run Code Online (Sandbox Code Playgroud)

有趣的是,它似乎与CONCAT功能有关.以下工作原理:

select 1 
from SYSIBM.DUAL
where 'abc' like cast('abc' as varchar(32672))
Run Code Online (Sandbox Code Playgroud)

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

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

鉴于另一个IBM产品在2010年为此问题创建了一个解决方法,我想这不是一个真正的错误,否则它会在平均时间内修复?

mus*_*cio 5

真正的啊哈!在这儿.

首先,根据连接运算符结果类型的规则,将两个组合长度为4000字节或更少的VARCHAR连接起来,产生该组合长度的VARCHAR,例如concat(varchar(2000), varchar(2000)) = varchar(4000).连接长度为4001或更多的两个VARCHAR会产生长度为32 700的LONG VARCHAR.虽然不推荐使用LONG VARCHAR类型,但我认为连接行为仍然使用遗留逻辑.

$ db2 describe "values concat(cast('a' as varchar(2000)), cast('bc' as varchar(2000)))"

Column Information

Number of columns: 1

SQL type              Type length  Column name                     Name length
--------------------  -----------  ------------------------------  -----------
448   VARCHAR                4000  1                                         1


$ db2 describe "values concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))"

Column Information

Number of columns: 1

SQL type              Type length  Column name                     Name length
--------------------  -----------  ------------------------------  -----------
456   LONG VARCHAR          32700  1     
Run Code Online (Sandbox Code Playgroud)

其次,LIKE谓词期望模式表达式为VARCHAR,最大长度为32672字节.

随后,当您在不知不觉中尝试使用LONG VARCHAR作为模式表达式时,会出现错误.它不是关于操作数的长度,而是关于它的数据类型.以下应该有效:

select 1 
from SYSIBM.DUAL
where 'abc' like 
   cast(concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))
   as varchar(32672))
Run Code Online (Sandbox Code Playgroud)

  • 只是为了解决这个问题,PMR被拒绝了,因为"它按设计工作"和"有一个解决方法".所以那里. (2认同)