在Oracle中插入空字符串

The*_*ler 4 sql database oracle

我正在尝试在Oracle的非可空列中插入一个空字符串但是失败了.这是案例:

create table trademark (
  name varchar2(100) not null
);

insert into trademark (name) values ('Kodak');

insert into trademark (name) values (' '); -- one space

insert into trademark (name) values (''); -- empty string
Error: ORA-01400: cannot insert NULL into ("USER1"."TRADEMARK"."NAME")
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Gor*_*off 10

在Oracle中,空字符串相当于NULL.

在几乎任何其他数据库中,两者都不同,但这就是Oracle如何定义NULL字符串的值(默认情况下).

这在文档中有解释,并附有这个诱人的注释:

注意:

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

突出显示的部分是我的.我不确定你应该如何遵循这个建议.我认为这意味着NULL明确使用,而不是''在您打算使用时NULL.

请注意,在SQL中,NULL表示未知值,而不是空值.没有字符的字符串(完全有效的字符串)与NULL未知的值之间存在很大差异.在实践中,NULL通常用于遗漏,但这更像是一种约定而不是定义.

  • @WilliamRobertson - 这是胡说八道."NULL"和空字符串都不是"空格".如果你的意思是"未确定",那根本就不是真的; "NULL"未确定,而空字符串则不确定.应允许空字符串作为连接的中性元素(与0相同,用于添加数字).空字符串的长度应为0,"NULL"的长度应为"NULL". (3认同)
  • 谢天谢地,Oracle保持理智,没有两种虚无。 (2认同)
  • 一个常见的论点是"允许空字符串与`NULL`不同会导致很多问题." 我从来不理解那个论点; 这肯定是假的,但我想至少理解一些合乎逻辑的反对意见.(我见过很多,但实际上没有任何意义.)相反,我们必须使用很多愚蠢的解决方法,因为空字符串**与Oracle中的"NULL"相同.保持这种方式有意义的唯一理由是不要在SQL标准强制正确处理之前呈现无效的查询. (2认同)