Oracle将空字符串视为Java / JPA程序员的NULL问题

时间:2011-04-01 07:48:20

标签: java oracle hibernate jpa jpa-2.0

如何处理Oracle在数据库中将空字符串存储为空的情况?

我希望将它存储为空字符串,因为它不是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中仍然未知的新类型,它可以保留空字符串,而不会将其更改为空值?

谢谢!

6 个答案:

答案 0 :(得分:16)

是的,这就是Oracle的运作方式。空字符串被视为空值。

您当然可以在应用程序级别“修复”此问题 - 例如,按照您的建议存储" "值 - 但首先要考虑的是,与{{1}相比,您的“空字符串”值的差异究竟是什么?值?为什么你需要区别对待它们?我曾经遇到过这种困境,但通常会发现很少有我真正需要区分的案例。

答案 1 :(得分:3)

不仅选择具有特殊条件的条件,还要处理Java String Objects。 如果你有一个字符串a =“”你可以调用它的长度方法并获得0。 如果你有一个String a = null,你在调用length时会得到一个nullpointer异常。 因此,使用oracle db会强制您在检查长度之前始终检查字符串是否为null :(

答案 2 :(得分:2)

create index idx_myfield on mytable(nvl(myfield,-1));

select * from mytable where nvl(myfield,-1)=-1;

答案 3 :(得分:2)

不,没有办法将空字符串视为空字符串。 Oracle始终将长度为零的字符串视为NULL值。

答案 4 :(得分:2)

它早于我,但不是

select * from mytable where myfield like '%' or myfield is null

相同
select * from mytable

因此,Oracle简化了您的生活! ;)

答案 5 :(得分:0)

Beleive Oracle通过将空字符串转换为NULL来优化数据库。 首先,仍然需要将空字符串显式地存储在数据块级别的数据库存储中(* 1)。存储为NULL可能会减少数据存储空间。 第二,如果在列上定义了任何索引,则NULL值不包括在索引中,从而减少索引存储占用空间。 (* 2)

从设计和开发的角度来看,除非空白空间确实从业务角度更改数据的语义,存储为NULL应该没问题。

如上所述,在框架级(或父类)添加代码将无需在所有子类和类型中输入代码。对象 - 这就是面向对象甚至基本编程所要做的事情。

如果我的代码表现最佳,因为我的数据库存储已经过优化,那么我应该感到高兴。 如果我的代码性能在生产中存储只是因为我想节省一点打字或者没有做出精巧的设计/开发,那就太糟糕了?

我很高兴Oracle正在为我优化它。

所有关于Oracle NULL:

NULL是一个特殊值。 NULL不等于包括它自身在内的任何东西,即NULL不等于NULL