【问题标题】:Oracle empty stringsOracle 空字符串
【发布时间】:2010-10-16 02:03:58
【问题描述】:

你们如何使用 Oracle 处理空字符串?

语句 #1:Oracle 将“varchar2”字段中的空字符串(例如 '')视为 NULL。
语句 #2:我们有一个模型定义了抽象的“表结构”,其中我们有字段,不能为NULL,但可以为“空”。该模型适用于各种 DBMS;几乎在所有地方,一切都很好,但不是 Oracle。您只是不能在“非空”字段中插入空字符串。
语句 #3:在我们的例子中不允许非空默认值。

那么,有人能告诉我吗?我们该如何解决?

【问题讨论】:

    标签: oracle orm varchar2


    【解决方案1】:

    这就是为什么我一直不明白 Oracle 为何如此受欢迎的原因。基于他们多年前做出的一个愚蠢决定,他们实际上并没有遵循 SQL 标准。

    Oracle 9i SQL Reference 指出(至少三个主要版本都存在该参考):

    Oracle 当前将长度为零的字符值视为空值。但是,在未来的版本中,这可能不会继续存在,Oracle 建议您不要将空字符串视为 null。

    但他们没有说你应该做什么。我发现解决此问题的唯一方法是:

    • 有一个不能出现在真实数据中的标记值来表示 NULL(例如,姓氏字段的“脱氧核糖核酸”,并希望电影明星不要开始给他们的孩子起奇怪的姓氏和奇怪的名字:- )。
    • 有一个单独的字段来指示第一个字段是否有效,基本上是真实数据库对 NULL 所做的。

    【讨论】:

    • “基于他们多年前做出的一个愚蠢决定”是的,因为向后兼容性从不成为问题。 Oracle 可以安全地更改空字符串的行为,而不会破坏依赖此行为的大量代码 -.-
    • @Null,有多种方法可以解决此问题而不会破坏兼容性。一个人在阅读您的评论后的一秒钟内跳进了我的脑海,即允许为特定代码设置一个标志,以便在“符合”模式下运行它。这样,如果您没有为所有代码显式设置标志,您将拥有完美的兼容性。如果您希望特定代码正确处理 NULL,请为其设置标志。一旦您确信您不再有垃圾代码,请在全局范围内设置标志。至少从 Data General 时代起,这些“杂物”就已经存在了 :-)
    • 这类似于 SQL Server 的ANSI NULLS(例如:SET ANSI NULLS ON),但不同的环境行为不同可能会造成很大的混乱。
    【解决方案2】:

    Oracle 中的空字符串和 NULL 是一回事。您希望允许空字符串但不允许 NULL。

    您在表上设置了 NOT NULL 约束,这与非空字符串约束相同。如果你去掉那个约束,你会失去什么?

    【讨论】:

    • 清晰的模型定义,仅此而已。
    【解决方案3】:

    我们是否可以说“不支持 Oracle,直到它支持标准 SQL 行为”?在许多方面,这似乎是最不痛苦的方式。

    如果您不能强制(使用)单个空格,或者可能是 Unicode 零宽度不间断空格 (U+FEFF),那么您可能不得不全力以赴并使用一些难以置信的东西,例如 32 Z表示数据应该是空白的,但不是因为使用的 DBMS 是 Orrible。

    【讨论】:

    • 向零宽度不间断空间致敬,英雄和我们的救援,精神错乱的守护者,所有 Oracle mantainers 的祸根!
    猜你喜欢
    • 2013-12-01
    • 2023-03-12
    • 2014-03-18
    • 2013-09-16
    • 1970-01-01
    • 2016-10-10
    • 2011-07-27
    • 2018-12-04
    • 2013-01-15
    相关资源
    最近更新 更多