用于文本比较的DB2参数绑定

用于文本比较的DB2参数绑定,db2,odbc,drivers,sqlparameter,Db2,Odbc,Drivers,Sqlparameter,我有以下缩写格式的DB2 SQL: Select ... From ... Where ... ((COL1 IS NULL) And ('' = ?)) ... Order By ... 此SQL的大致用途是在COL1的输入为空时返回空记录 但是,如果我尝试将“RED”绑定到占位符,我会得到一个CLI0109E错误,指示“字符串数据右截断”。我相信发生的情况是DB2已确定SQL中的“”文本是长度为0的列,因此尝试比较长度为3的绑定参数(在“RED”的情况下)会导致截断错误。这是有道理的 如果

我有以下缩写格式的DB2 SQL:

Select ...
From ...
Where ... ((COL1 IS NULL) And ('' = ?)) ...
Order By ...
此SQL的大致用途是在COL1的输入为空时返回空记录

但是,如果我尝试将“RED”绑定到占位符,我会得到一个CLI0109E错误,指示“字符串数据右截断”。我相信发生的情况是DB2已确定SQL中的“”文本是长度为0的列,因此尝试比较长度为3的绑定参数(在“RED”的情况下)会导致截断错误。这是有道理的

如果我将SQL更改为:
((COL1为NULL)和({10 spaces}=?)
,它就可以正常工作

如果我将SQL更改为:
((COL1为NULL)和(强制转换(“”为VARCHAR(32767))=?)
,则它可以正常工作

是否有我缺少的驱动程序设置或SQLBindParameters设置导致DB2将“”解释为零长度列

我通过Oracle和SQLServer运行相同的SQL,它们工作正常,这告诉我它们将“”解释为不同的内容,并且默认情况下可能将SQL中的所有文本都视为VARCHAR(32767)或其他内容


感谢您的帮助。

这个问题的答案似乎是,在确定文本的数据类型和大小时,DB2就是这样工作的

据我所知,这里要理解的概念似乎是隐式和显式的。由于没有为空字符串文本提供显式强制转换,并且在比较谓词的右侧没有进一步的信息(只有参数占位符存在,并且它没有提供确定的大小信息),DB2将隐式强制转换为文本的大小,在本例中为CHAR(1)(或者可能是VARCHAR(1),在这一点上我不完全确定)

因此,这不是CLI驱动程序问题或怪癖,也不是SQLBindParameters问题。显式强制转换(“”as VARCHAR(nn))似乎是避免CLI0109E错误的正确解决方案


值得一提的是,严格根据我的经验,在这些平台上运行相同的SQL时,Oracle和SQLServer的行为似乎与DB2不同。它们的隐式类型转换(缺少任何可用的大小信息)似乎是VARCHAR(大)。但是显式转换也同样适用于他们。

这个问题的答案似乎是,在确定文本的数据类型和大小时,DB2就是这样工作的

据我所知,这里要理解的概念似乎是隐式和显式的。由于没有为空字符串文本提供显式强制转换,并且在比较谓词的右侧没有进一步的信息(只有参数占位符存在,并且它没有提供确定的大小信息),DB2将隐式强制转换为文本的大小,在本例中为CHAR(1)(或者可能是VARCHAR(1),在这一点上我不完全确定)

因此,这不是CLI驱动程序问题或怪癖,也不是SQLBindParameters问题。显式强制转换(“”as VARCHAR(nn))似乎是避免CLI0109E错误的正确解决方案

值得一提的是,严格根据我的经验,在这些平台上运行相同的SQL时,Oracle和SQLServer的行为似乎与DB2不同。它们的隐式类型转换(缺少任何可用的大小信息)似乎是VARCHAR(大)。但明确的演员阵容也同样适用于他们