文章目录
1、概述
Mysql、Oracle两种数据库处理空串与null的机制是不同的,在这两种数据库之间做项目迁移,很可能会产生应用报错。下面我们来分析下这两种数据库是如何处理空串与null的,探讨下如何解决此类报错。
2、空串和null
Mysql数据库是完全区分空串与null的,Oracle数据通常情况下不是区分的,但是也有特殊场景是区分的。下面我们比较一下3种常见的场景:
场景1:数据插入(mysql区分,oracle不区分)
sql1:insert into tb1(c1,c2) values(1,'');
sql2:insert into tb1(c1,c2) values(2,null);
在mysql数据库中,sql1与sql2存入c2字段的值是不一样的;

而在oracle数据库中2个sql存入c2字段的值是相同的。

场景2:数据查询(mysql区分空串和null,oracle只能用is null检索)
sql1:select * from tb1 where c2='';
sql2:select * from tb1 where c2 is null;
在mysql数据库中2个sql的查询结果是不同的。

在oracle数据库中,用=‘’检索不到数据,应使用is null

场景3:函数处理
select replace('aaaabb','bb',''),replace('aaaabb','bb',null) from dual ;
mysql的函数中是区分空串与null的。

oracle中,null被当做空串处理

3、关于Mysql的EMPTY_STRING_IS_NULL参数
早期的Mysql版本可以通过sql_mode开启EMPTY_STRING_IS_NULL参数,兼容ORACLE数据库。在Mysql8.0以后的版本中这个参数被废除了。还有一些信创数据库仍然保留EMPTY_STRING_IS_NULL,如goldendb。
开启EMPTY_STRING_IS_NULL参数,虽然可以向Oracle一样,将insert的空串转换为Null存入数据库。但是也会带来一些风险隐患。目前看到的隐患主要有2个:
1、 可能会出现部分数据无法检索的问题
中途修改EMPTY_STRING_IS_NULL参数可能会出现数据无法检索的问题。
原因是中途开启这个参数,并不影响存量数据。此时,数据库中既有空串又有null,而空串无法通过where 字段=‘’检索。
2、函数处理空串结果为Null的问题
开启EMPTY_STRING_IS_NULL后,会导致类似下面SQL的返回结果为null
select replace('aaaabb','bb','') from dual ;
4、迁移方案
oracle迁移到mysql数据库或goldendb数据中如何处理空串和null的问题呢?如何实现insert 空串,存入空值的效果?
方案1:根据实际需求改写Insert端代码,尽量不混用空串和null。
方案2:老版本的Mysql或goldendb数据库,如果不想修改代码。可以在Insert端,在session级别开启EMPTY_STRING_IS_NULL。建议不要开启全局的EMPTY_STRING_IS_NULL,避免一些用到空值的函数失效。
DLM 2026.6.22
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/limintjhn8820/article/details/162202662



