2015-03-02 121 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

相關問題