Почему DB2 обрабатывает пустую строку как null?

Использование DB2 10.5 в Windows x64

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), НЕ NULL

Это ожидаемое поведение? Если да, то как мне обойти это, а если нет, то с чем это может быть связано?

Изменить: в том же духе SELECT ID, HOST from dbo.datasource_databases WHERE HOST != '' возвращает 0 строк, где проверка HOST != 'some gibberish' возвращает строки. Для меня это имеет еще меньше смысла, чем приведенное выше поведение (не следует ли просто рассматривать его как HOST NOT NULL?).


person Karl    schedule 02.03.2015    source источник
comment
IIRC (и я не пошел проверять Руководства по DB2 10.5), потому что это так (и, вероятно, стандарт SQL это позволяет), и обходным путем является сохранение пробела ' ' вместо пустой строки ''.   -  person Jonathan Leffler    schedule 03.03.2015


Ответы (1)


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

person mustaccio    schedule 03.03.2015
comment
Это оказалось так. По-видимому, установка DB2_COMPATIBILITY_VECTOR=20 или DB2_COMPATIBILITY_VECTOR=ORA приводит к тому, что все поля VARCHAR обрабатываются как VARCHAR2. В итоге мне пришлось немного повозиться с реестром, так как db2set не везде правильно обновлял настройки, но как только я все очистил, перезапустил менеджер базы данных и воссоздал базу данных, она наконец заработала. Спасибо за помощь! - person Karl; 03.03.2015
comment
Это цена, которую вы платите за совместимость с базой данных Oracle. - person mustaccio; 03.03.2015