【问题标题】:Sybase inserts a single space in place of the empty string ''Sybase 插入一个空格来代替空字符串 ''
【发布时间】: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_PADDING on 和off 下都是如此,这比ANSI_NULLS 更相关)。 (而varcharvarchar(1),省略长度是不好的形式。)
  • ASCII(a1) 是否提供了任何有趣的东西(也就是说,不是 32)?
  • @JeroenMostert ASCII(a1)32

标签: sql sql-server tsql sybase sap-ase


【解决方案1】:

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 定义”:

“abc”+“”+“def”

空字符串永远不会被评估为 NULL。

从内存中:在 Sybase 中,您可以将 NULL 值分配给字符串,它将被解释为空字符串。 - 不过我可能是错的。

另一个解决方法是rtrim( '' )

【讨论】:

  • insert into a(a1) (select rtrim('')) 插入 NULL
【解决方案2】:

ASE 在 DBMS 世界中是独一无二的,因为空字符串实际上计算为单个空格。正如有人提到的,当你连接它时,NULL 充当一个真正的空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 2020-10-22
    • 2012-05-19
    • 2021-12-04
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多