Sybase вставляет один пробел вместо пустой строки '' - PullRequest
0 голосов
/ 12 сентября 2018

Очевидно, что при вставке пустой строки ('') в столбец VARCHAR Sybase (протестировано в ASE 15.7) вставляет вместо него один пробел. Экспериментируя, я убедился, что опция 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 для чтения из базы данных и выполнения определенных утверждений).

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

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

0 голосов
/ 12 сентября 2018

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( '' )

...