Sybase вставляет одно место вместо пустой строки ''

90
9

По-видимому, при вставке пустой строки ('') в столбце VARCHAR Sybase (проверенном в ASE 15.7) вместо этого вставлен один пробельный символ. Экспериментируя, я подтвердил, что опция ansinull не ansinull на это поведение:

> set ansinull on
> create table a (a1 varchar(1))
> insert into a(a1) values ('')
> select a1, len(a1) as 'len(a1)', datalength(a1) as 'datalength(a1)',
ascii(a1) as 'ascii(a1)', char_length(a1) as 'char_length(a1)'
from a
> go
(1 row affected)
a1 len(a1) datalength(a1) ascii(a1) char_length(a1)
-- ----------- -------------- ----------- ---------------
1 1 32 1

(1 row affected)
>
>
> drop table a
> go
> set ansinull off
> create table a (a1 varchar(1))
> insert into a(a1) values ('')
> select a1, len(a1) as 'len(a1)', datalength(a1) as 'datalength(a1)',
ascii(a1) as 'ascii(a1)', char_length(a1) as 'char_length(a1)'
from a
> go
(1 row affected)
a1 len(a1) datalength(a1) ascii(a1) char_length(a1)
-- ----------- -------------- ----------- ---------------
1 1 32 1

(1 row affected)

Есть ли оправдание/аргументация для этого поведения и как я могу отключить эту "функцию"? Наследуется ли это поведение в кодовой базе SQL Server?

Я был укушен этим, так как моя тестовая логика потерпела неудачу, так как я выполнял сравнение .equals() (в клиентском Java-коде, использующем JDBC для чтения из базы данных и принятия определенных утверждений).

спросил(а) 2021-01-19T17:10:27+03:00 6 месяцев, 2 недели назад
1
Решение
78

RE: "Является ли это поведение унаследованным в кодовой базе SQL Server?" - Нет

RE: "Есть ли оправдание/аргументация для этого поведения и как я могу отключить эту" функцию "?" - Не то, чтобы я в курсе. Это один из многочисленных причуд Sybase.

От http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36271.1550/html/blocks/blocks311.htm

Пустая строка ("") или ('') интерпретируется как один пробел в операторах вставки или присваивания в данных varchar или univarchar. В конкатенации данных varchar, char, nchar, nvarchar пустая строка интерпретируется как одно пространство; для следующего примера хранится как "abc def":

"abc" + "" + "def"

Пустая строка никогда не оценивается как NULL.

Из памяти: в Sybase вы можете назначить значение NULL для строки, и оно будет интерпретироваться как пустая строка. - Я мог ошибаться.

Другая работа вокруг - rtrim( '' )

ответил(а) 2021-01-19T17:10:27+03:00 6 месяцев, 2 недели назад
64

ASE уникальна в мире СУБД, поскольку пустая строка фактически оценивает как одно пространство. Как упоминалось, NULL действует как истинная пустая строка, когда вы ее конкатенируете.

ответил(а) 2021-01-19T17:10:27+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема