2015-03-02 323 views
1

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

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 

HOST使用DB2 10.5是一个VARCHAR(512)NOT NULL

这是预期的行为?如果是这样,我该如何解决这个问题,如果没有,可能会导致这种情况?

编辑:沿着同样的路线,SELECT ID, HOST from dbo.datasource_databases WHERE HOST != ''返回0行,其中检查HOST != 'some gibberish'将返回行。对我来说,这比上面的行为更没有意义(不应该把它当作HOST NOT NULL?)。

+0

IIRC(我还没有去检查[DB2 10.5手册](http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.kc。 doc/welcome.html)),它是“因为它确实”(并且可能SQL标准允许这样做),解决方法是存储空间''''而不是空字符串''''。 – 2015-03-02 23:56:39

回答

4

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

+0

原来是这样。显然,设置'DB2_COMPATIBILITY_VECTOR = 20'或'DB2_COMPATIBILITY_VECTOR = ORA'会导致所有VARCHAR字段被视为VARCHAR2。 由于'db2set'没有正确地更新设置,所以我最终不得不做了一些摆弄注册表的工作,但是一旦我清除了所有内容,重新启动了数据库管理器并重新创建了数据库,它终于开始工作了。谢谢您的帮助! – Karl 2015-03-03 01:07:44

+0

这就是您支付的价格“与Oracle数据库兼容”。 – mustaccio 2015-03-03 01:24:25

相关问题