【问题标题】:Is it possible to store '' (empty string) as a non NULL value in the database?是否可以将“”(空字符串)作为非 NULL 值存储在数据库中?
【发布时间】:2011-01-12 05:54:57
【问题描述】:

我正在使用 Oracle 数据库。在数据库级别,当您将列值设置为 NULL 或 ''(空字符串)时,在这两种情况下获取的值都是 NULL。是否可以将''(空字符串)作为非NULL值存储在数据库中?

我执行这个

UPDATE contacts SET last_name = '' WHERE id = '1001';

commit;

SELECT last_name, ID FROM contacts WHERE id ='1001';

LAST_NAME                  ID
------------               ------
null                       1001

是否可以将 last_name 存储为非 NULL 空字符串 ('')?

【问题讨论】:

  • 当然正确的做法是将未知值存储为 null 而不是空字符串。
  • 空字符串是有效值。它不是一个未知值。 null 告诉我们用户不知道此联系人的姓氏,因此如果可能,我们必须从 LDAP 获取姓氏。空字符串告诉我们用户故意删除了此联系人的 last_name,因此它不是未知值。它有一个空字符串的定义值,它不同于代表未知值的 null。
  • 深知 Oracle 将 '' 等同于 NULL 的历史问题,并且有点同意,但如果您想要存储 '' 的唯一原因是告诉用户删除了一个值,那就是为什么你有日志或日志表。换句话说,避免设计需要具有特殊含义的魔法值。

标签: sql oracle oracle11g


【解决方案1】:

在 oracle 中执行此操作的唯一方法是使用某种辅助标志字段,当设置该字段时,它应该表示值应该是空字符串的事实。

【讨论】:

    【解决方案2】:

    据我所知,Oracle 不区分 '' 和 NULL,请参阅 here.

    【讨论】:

      【解决方案3】:

      Oracle 有一个众所周知的行为,它会在 INSERT 和 UPDATE 语句中默默地将 "" 转换为 NULL

      您必须在代码中处理此问题,通过在重新读取列时将NULL 转换为"" 来防止这种行为,并且不要在程序中一开始就使用null

      【讨论】:

      • 我怎样才能“在我的代码中处理这个以防止这种行为”?
      • 当然,您可以轻松地将NULL 转换为'''sproing' 或其他任何内容。但问题是你无法区分值和非值。
      • 这就是为什么 null 被称为 十亿美元的错误,当时十亿美元是很多钱,今天它是 万亿美元错误.
      • null 是一个错误,还是只是它的实施方式?我同意在 SQL 中与null 存在许多愚蠢的不一致。但是,如果null 不存在,我们将有很多额外的标志列来指示是否设置了值,或者对值进行了很多特殊处理,例如-999。情况也不好。
      • @JarrodRoberson,SQL 中的 NULL 与指针有什么关系?
      【解决方案4】:

      很久没用oracle了,但相信我们以前都是用一个空格''来表示一个空字符串,看完再剪掉。

      【讨论】:

      • 直到有人需要在字符串中存储一个空格...您需要某种转义序列或其他东西,然后您必须确保所有代码都适用于该列知道如何解释特殊语法:(
      • “直到有人需要在字符串中存储一个空格” - 当然,这仅在例如尾随空格不重要时才有效。在许多应用程序中都是如此。
      • 在 Oracle 上运行时,数据访问层可以故意为每个字符串添加一个字符的前缀(在检索时将其剥离)。丑得要死。但后来“丑陋的地狱”和甲骨文相处得很好。
      • 我记得一个选择查询,其中 where 子句依赖于空格的存在,即''我们不小心修剪了绑定变量,瞧,有超过一百万条记录被返回给客户端,因为在百万行代码中的某处,如果变量为空,则存在删除 where 子句的逻辑。不用说,我们严重损失了服务。当然,我们可以对结果集以及我们从事故中学到的其他十几个好东西设置一个最大限制。
      • @JeffreyKemp,很多默认数据库行为(例如字符串比较)会忽略尾随空格,因此如果您需要在字段中存储单个空格并将其与空字符串区别对待,您可能无论如何都需要做一些特别的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      相关资源
      最近更新 更多