【发布时间】:2019-02-16 11:14:29
【问题描述】:
显然,在 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() 比较(在使用 JDBC 从数据库读取并做出某些断言的客户端 Java 代码中)之后,我的测试逻辑失败了。
【问题讨论】:
-
如果将列定义更改为
varchar(1)会怎样? -
同样的事情,不管
ansinull的值是多少 -
在 SQL Server 中
len(a1)是0,但它总是如此,因为len不计算尾随空格。更相关的是datalength(a1)(计算字节数)也是0,表明该值确实为空(在ANSI_PADDINGon 和off 下都是如此,这比ANSI_NULLS更相关)。 (而varchar是varchar(1),省略长度是不好的形式。) -
ASCII(a1)是否提供了任何有趣的东西(也就是说,不是32)? -
@JeroenMostert
ASCII(a1)给32
标签: sql sql-server tsql sybase sap-ase