用于文本比较的DB2参数绑定
我有以下缩写格式的DB2 SQL:用于文本比较的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”的情况下)会导致截断错误。这是有道理的 如果
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(大)。但明确的演员阵容也同样适用于他们