【问题标题】:Null column with null values具有空值的空列
【发布时间】:2014-11-10 16:22:37
【问题描述】:

背景:

我正在处理旧版 SQL Server 2000 数据库(是的,我正在更改它!)。它有一个列,我们可以称之为 name,它是 nvarchar(100) 而不是 null。我已经验证过了。

当我运行这个查询时:

select name
from mytable
where name is null

我没有得到任何结果。但是,当我运行此查询时:

select name
from mytable
where name = ''

我得到大约 100 个结果。我想了解更多关于这些空白值的信息,因为空格在非空列中是合法的,所以我运行了这个查询:

select ASCII(substring(name, 1, 1))
from s
where name = ''

这会为大约三分之一的结果(即空格)返回“32”。然而,对于其他 2/3rds,它返回 null。

问题:

  1. 如何在具有非空定义的列中存在空值?
  2. 为什么这些空值没有出现在“name is null”查询中?

【问题讨论】:

  • 你没有NULL 值,你自己说的,对吧?
  • 我猜字符值 '\0` 被解释为NULL。我相信它的正式名称是“NUL”。
  • 你需要明白ASCII(substring(name, 1, 1))返回你NULL,并不意味着name是空的
  • @Lamak:我没有空值,因为“名称为空”什么都不返回。
  • 这意味着其中没有空值。正如我所说,ASCII(substring(name, 1, 1))name 不同

标签: sql sql-server sql-server-2000


【解决方案1】:

name 列中没有 NULL,您已在第一个查询中验证了这一点。

name = '' 条件匹配空字符串和空格字符串。

name 为空时,SUBSTRING(name, 1, 1) 也为空,ASCII 的参数也是如此。在这种情况下,ASCII 返回 NULL。当name 是一串空格时,提供给ASCII 的参数是一个空格,因此结果是32,即空格字符的ASCII 码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多