【发布时间】:2011-07-27 12:00:04
【问题描述】:
Oracle 将空字符串作为 null 存储在数据库中的情况如何处理?
我希望它存储为空字符串,因为它不是 NULL,因为发出查询会更容易。
这样的事情会选择空字符串和非空字符串,但不会选择空值
select * from mytable where myfield like '%';
如果我还想选择空值(最初应该是空字符串),我必须像这样选择:
select * from mytable where myfield like '%' or myfield is null;
我很想在以后的 sql 语句中跳过or myfield is null
我想到的当前解决方案是在应用程序级别处理这个问题, 例如,在实体中,我将我的所有 String 字段默认值初始化为一个空格,例如:
@Entity
public class MyEntity {
private String name = " ";
public void setName(String name) {
if (isEmptyString(name)) {
name = " ";
}
}
...
}
或者,也许,我可以使用 Oracle 11g 中我仍然未知的新类型,它可以保持空字符串不变而不将其更改为空值?
谢谢!
【问题讨论】:
-
我想您可以使用@PrePersist 并检查名称字段的大小,如果为空,则将其替换为“”。
-
我通过 not 使用存在根本缺陷的 DBMS 来解决该特定问题。换句话说,我使用 DB2 :-)
-
一些 JPA 实现可能会通过插入一个特殊字符来表示空字符串来满足这一点。这就是我们使用 DataNucleus 为您做的事情
-
来自 Oracle 官方文档:“Oracle 数据库目前将长度为零的字符值视为 null。但是,在未来的版本中可能不会继续如此,Oracle 建议您不要这样做将空字符串视为与 null 相同。” docs.oracle.com/cd/B28359_01/server.111/b28286/… 这听起来像 NULL 和 "" 总是被认为是相等的 - 但是您(和我)观察到 "" 只是存储为 NULL,因此与 "" 进行比较可能会产生不同的结果,对吗?
标签: java oracle hibernate jpa jpa-2.0