关注

Mysql与Oracle在处理空串与null上的差异

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

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--