为什么DB2将空字符串视为null?

为什么DB2将空字符串视为null?,db2,db2-luw,Db2,Db2 Luw,在Windowsx64上使用DB210.5 UPDATE dbo.datasource_databases SET HOST = '' WHERE ID = 1 Assignment of a NULL value to a NOT NULL column "TBSPACEID=2, TABLEID=6, COLNO=1" is not allowed.. SQLCODE=-407, SQLSTATE=23502, DRIVER=3.67.28 主机是一个VARCHAR(512)非空 这是预

在Windowsx64上使用DB210.5

UPDATE dbo.datasource_databases
SET HOST = ''
WHERE ID = 1

Assignment of a NULL value to a NOT NULL column "TBSPACEID=2, TABLEID=6, COLNO=1" is not allowed.. SQLCODE=-407, SQLSTATE=23502, DRIVER=3.67.28
主机是一个VARCHAR(512)非空

这是预期的行为吗?如果是,我应该如何解决这个问题?如果不是,是什么原因造成的


编辑:沿着相同的行,
选择ID,HOST from dbo.datasource_databases WHERE HOST!=''返回0行,其中检查
主机!='一些乱七八糟的“
将返回行。对我来说,这比上述行为更有意义(难道不应该将其视为
主机不为NULL
?)。

只有在为数据库启用Oracle兼容性或至少Oracle的VARCHAR2数据类型兼容性时,才会发生这种情况,如下所示。通常情况下,按照ANSI SQL标准的规定,DB2将空字符串视为长度为零的字符串,而不是空字符串。

只有在为数据库启用Oracle兼容性或至少Oracle的VARCHAR2数据类型兼容性时,才会发生这种情况,如图所示。通常情况下,按照ANSI SQL标准的规定,DB2将空字符串视为长度为零的字符串,而不是空字符串。

IIRC(我没有去检查),这是“因为它确实存在”(可能SQL标准允许这样做),解决方法是存储一个空格
'
,而不是一个空字符串
'
.IIRC(我没有去检查),这是“因为它确实如此”(可能SQL标准允许这样做),解决方法是存储一个空格,而不是一个空字符串。事实证明就是这样。显然,设置
DB2\u COMPATIBILITY\u VECTOR=20
DB2\u COMPATIBILITY\u VECTOR=ORA
会导致所有VARCHAR字段都被视为VARCHAR2。从
db2set
没有正确地到处更新设置,但一旦我清除了所有内容,重新启动了数据库管理器并重新创建了数据库,它终于开始工作了。感谢您的帮助!这是您为“与Oracle数据库兼容”而付出的代价显然,设置
DB2\u COMPATIBILITY\u VECTOR=20
DB2\u COMPATIBILITY\u VECTOR=ORA
会导致所有VARCHAR字段都被视为VARCHAR2。我不得不对注册表进行一些修改,因为
db2set
没有正确地到处更新设置,但一旦我清除了所有内容,r启动数据库管理器,并重新创建数据库,它终于开始工作。感谢您的帮助!这是您为“与Oracle数据库兼容”而付出的代价。