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

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

我希望它存储为空字符串,因为它不是NULL,因为发出查询会更容易。

像这样的东西会选择空字符串和非空字符串,但不会选择空值

select * from mytable where myfield like '%'; 

如果我还要选择空值(原本应该是空字符串),我必须选择如下:

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

我希望在我的sql语句中or myfield is null跳过做or myfield is null

我想到的当前解决方案是在应用程序级别中处理这个问题,例如,在实体中,我将我的所有String字段默认值初始化为空格,例如:

 @Entity public class MyEntity { private String name = " "; public void setName(String name) { if (isEmptyString(name)) { name = " "; } } ... } 

或者,也许,我可以使用Oracle 11g中未知的新类型,它可以保留空字符串,而不会将其更改为空值?

谢谢 !

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

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

尝试

 create index idx_myfield on mytable(nvl(myfield,-1)); select * from mytable where nvl(myfield,-1)=-1; 

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

它早在我身边,但事实并非如此

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

同样的

 select * from mytable 

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

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

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

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

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

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

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

所有关于Oracle NULL:

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