2015-03-02 3 views
1

Использование DB2 10.5 на 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 является 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), и обходным путем является сохранение пробела '' ''вместо пустой строки' '''. –

ответ

4

Это может произойти только в том случае, если для базы данных совместима совместимость с Oracle или, по крайней мере, совместимость с типами данных VARCHAR2 для Oracle, как described here. Обычно DB2, как предписано стандартом ANSI SQL, обрабатывает пустые строки как строки нулевой длины, а не NULL.

+0

Это оказалось. По-видимому, установка 'DB2_COMPATIBILITY_VECTOR = 20' или' DB2_COMPATIBILITY_VECTOR = ORA' приводит к тому, что все поля VARCHAR обрабатываются как VARCHAR2. В конце концов мне пришлось поработать с реестром, так как 'db2set' не обновлял настройки повсеместно, но как только я очистил все, перезапустил диспетчер баз данных и воссоздал базу данных, он наконец начал работать. Спасибо за помощь! – Karl

+0

Это цена, которую вы платите, чтобы быть «совместимой с базой данных Oracle». – mustaccio

Смежные вопросы