null vs empty string in Oracle 在Oracle中,null和空字符串是不同的。Null表示缺少值,而空字符串表示一个存在但没有字符的值。 当一个字段被定义为允许为null时,它可以不包含任何值。这意味着在查询中,如果字段的值为null,它将不会被返回。 另一方面,空字符串是一个包含零个字符的字符串。它是一个有效的值,可以在查询中返回。但是,它与包含空格或其他空白字符的字符串是不同的。 在处理数据时,了解null和空字符串之间的差异非常重要。您应该根据特定的需求来确定如

8 浏览
0 Comments

null vs empty string in Oracle 在Oracle中,null和空字符串是不同的。Null表示缺少值,而空字符串表示一个存在但没有字符的值。 当一个字段被定义为允许为null时,它可以不包含任何值。这意味着在查询中,如果字段的值为null,它将不会被返回。 另一方面,空字符串是一个包含零个字符的字符串。它是一个有效的值,可以在查询中返回。但是,它与包含空格或其他空白字符的字符串是不同的。 在处理数据时,了解null和空字符串之间的差异非常重要。您应该根据特定的需求来确定如

我在Oracle 10g中有一个名为TEMP_TABLE的表,只有两列 - id和description,仅用于演示目的。

列id是一个由序列生成的主键,类型为NUMBER(35, 0) not null,列description的类型为VARCHAR2(4000) not null。

在这种情况下,基本表结构如下所示:

+--------------+-----------+---------------+

|Name | Null? | Type |

+--------------+-----------+---------------+

|ID | NOT NULL | NUMBER(35) |

|DESCRIPTION | NOT NULL | VARCHAR2(4000)|

+--------------+-----------+---------------+

创建完这个表后,我尝试交替插入以下INSERT命令。

INSERT INTO temp_table (id, description) VALUES (1, null); ->不成功

INSERT INTO temp_table (id, description) VALUES (2, ''); ->不成功

这两个命令都不成功,因为DESCRIPTION列上有not null约束。

在这两种情况下,Oracle报错:ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")

在Oracle中,空字符串被视为NULL值。

如果我删除DESCRIPTION列上的not null约束,则基本表结构如下所示:

+--------------+-----------+---------------+

|Name | Null? | Type |

+--------------+-----------+---------------+

|ID | NOT NULL | NUMBER(35) |

|DESCRIPTION | | VARCHAR2(4000)|

+--------------+-----------+---------------+

并且指定的两个INSERT命令都会成功。它们会在TEMP_TABLE的DESCRIPTION列中创建两行,一行为空值,另一行为空字符串''。

现在,如果我执行以下SELECT命令:

SELECT * FROM temp_table WHERE description IS NULL;

则会检索到两行,其中一行的DESCRIPTION列为NULL,另一行的DESCRIPTION列为空字符串''。

然而,以下SELECT语句从TEMP_TABLE中检索不到任何行:

SELECT * FROM temp_table WHERE description='';

它甚至无法检索到DESCRIPTION列中为空字符串的行。

显然,Oracle在这里将NULL值和空字符串''区别对待,然而在INSERT语句中并不是这样,因为在有not null约束的列中,无论是NULL值还是空字符串都无法插入。为什么会这样呢?

0
0 Comments

在Oracle中,出现(null vs empty string in Oracle)问题的原因是Oracle在内部将空字符串转换为NULL值。Oracle不允许插入空字符串。而与之相反,SQL Server允许你实现这个目标。

这里有两种解决方法:

1. 使用另一个列来表示"description"字段是否有效。

2. 在想要存储空字符串的地方使用一些虚拟值作为"description"字段的值(例如,将字段设置为'stackoverflowrocks',假设您的真实数据永远不会遇到这样的描述值)。

这两种方法都是愚蠢的解决方案 🙂

这个问题只针对字符串类型吗?还是其他数据类型也会出现这个问题?

我不知道。

0
0 Comments

在Oracle中,空的varchar2和null被视为相同,你的观察结果也证明了这一点。当你写:

select * from table where a = '';

这与写下面的代码是一样的:

select * from table where a = null;

而不是`a is null`,这将永远不会等于true,因此永远不会返回行。在插入时也是一样的,NOT NULL意味着你不能插入null或空字符串(空字符串被视为null)。

这一点在比较7.3(没有Java)和>=8.0(有Java)时尤为有意思。

另外,语句`where not(a = '')`也永远不会为true,因为`a = ''`等同于`a = null`,它的计算结果是UNKNOWN,而`not(UNKNOWN)`是UNKNOWN,这并不为true。关于UNKNOWN的详细信息,也可参考stackoverflow.com/questions/2692046/…中的答案。

0