编程经验点滴----在 Oracle 数据库中保存空字符串
写程序这么多年,近几天才发现,向 Oracle 数据库表中,保存空字符串 '' ,结果成了 null.
由于数据库数值 null 的比较、判断,与空字符串 '' 存在差异。一不留神,代码中留下了 bug ,期望保存成空字符串 '' ,结果成了 null,SQL where 条件的结果 (a1.dls = a2.dls),与预想的不同(两个 null 不能用 = 进行比较,而两个空字符串 '' 可以用=进行比较),导致查询结果数据也不同。
查网上资料,发现 Oracle 在空字符串 '' 的处理上,没有遵循 SQL 标准(ANSI)的做法。
实测 Oracle 11g 的 VARCHAR2 与 VARCHAR 两个字符串字段类型,都是保存后数据成了 null。
未测试 CHAR 类型,因为这个不符合我们的业务实际要求。
尝试翻阅各种网上文档(主要使用 bing 及 yahoo 搜索引擎,本来喜欢 google 搜索,可惜现在用不了;百度搜索的技术文章排序有问题,前几页的文章质量较低,没法用),也未找到合适的解决办法。
最后决定,在需要保存空字符串 '' 的地方,统一转换成保存字符串 '-' 。仅对于我们当前项目来说,是可以的。这也是无奈之举。
毕竟这样也能解决我们的问题。
这篇资料里有说:There is no such thing as an empty string in Oracle
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5984520277372
不知道最新版的 Oracle ,是否提供了遵循 SQL 标准的字符串类型。
--2017/8/24 补充,
Oracle 网站上,截止到 Oracle database 12c r2 版本 ,仍旧如此。
网址:
http://docs.oracle.com/database/122/SQLRF/Nulls.htm#SQLRF30037
里面有一段话:
Note:
Oracle Database currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.
简单翻译成中文,就是:
备注:
Oracle 数据库当前将长度为零的字符串,当成 null。然而,未来版本可能会改变。Oracle 建议你不要将空字符串与 null 等同对待(意思是要按 SQL 标准,区别对待 SQL 空字符串及 SQL null)。
------------------------------------------------------------------------------------------------------------------------------------
类似/相关文章导航:
编程经验点滴----避免在数据库访问函数中使用 try catch
http://www.cnblogs.com/jacklondon/archive/2012/05/04/2482659.html
编程经验点滴----避免使用汉语拼音做变量名
http://www.cnblogs.com/jacklondon/archive/2012/05/03/2480609.html
编程经验点滴----计算机软件设计的几个基本原则
http://www.cnblogs.com/jacklondon/p/3291829.html
------------------------------------------------------------------------------------------------------------------------------------
最近网站文章被其它网站抄袭严重,我不拒绝转载,转载请注明出处。
我是 Jacklondon Chen , @ http://www.cnblogs.com/jacklondon/ , @ http://zheguisoft.com/ .
-----------------------------------------------------------------------------------------------------------------------------------
编程经验点滴----在 Oracle 数据库中保存空字符串的更多相关文章
- mssql,mysql,Oracle 数据库中获得UUID字符串
sql server : select replace(newId(),'-','') oracle :select sys_guid() from dual SQL> select sys_g ...
- 编程经验点滴----巧妙解决 Oracle NClob 读写问题
最近一个新项目中,尝试在 Oracle 数据库中使用 NCLOB 来保存大的 xml 字符串. 在代码自动生成工具(通过 JDBC 驱动程序,读数据库表结构,自动生成对应的 java 代码,包含增加. ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- Oracle数据库中,误删除或者修改数据恢复方法
在我们实际工作中,误删除或者修改Oracle数据库中的数据,怎么办呢?这里给大家分享一种解决办法.假如你误操作的时间不超过30分钟(数据库默认的回滚保持段里的数据时间,可以在pl/sql执行窗口按ct ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- --关于null在oracle数据库中是否参与计算,进行验证,
--关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...
- Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别
[转] SYS.SYSTEM.DBSNMP. Oracle 数据库中 SYS.SYSTEM.DBSNMP.SYSMAN 四用户的区别 用户: SYS 用户: SYS,默认密码为 CHANGE_ON ...
- 【转】Oracle数据库中Sequence的用法
在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...
- oracle数据库中提供的5种约束
约束作用:用来保持数据的完整性,防止无效数据进入到数据库中.oracle数据库中提供的5种约束,都是限定某个列或者列的组合的.1.主键约束(PRIMARY KEY):在一个表中能唯一的标识一行.主键可 ...
随机推荐
- 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException
Java中,可以使用Arrays.asList(T... a)方法来把一个数组转换为List,返回一个受指定数组支持的固定大小(注意是固定大小)的列表.此方法同 Collection.toArray( ...
- foreach加循环体与不加循环体的区别
案例A(不加{}): <?php function genTree5($items) { foreach ($items as $item) echo $item['id'];die; $ite ...
- 《JavaScript总结》apply、call和bind方法
在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...
- Spring AOP实战例子与springmvc整合不起效果的解决办法
在使用AOP之前,首先我们先了解一下什么是AOP吧.在网上很多人将AOP翻译为“面向切面编程”,什么是面向切面?与面向对象有什么区别呢? 在回答这两个问题之前,我们先要明白切面的概念. 切面由切点与增 ...
- docker - 容器里安装redis
在docker中安装redis 使用命令行安装redis 下载并解压 wget http://download.redis.io/releases/redis-3.2.6.tar.gz tar -xv ...
- Deploying Keras model on Tensorflow Serving--
keras训练了个二分类的模型.需求是把keras模型跑到 tensorflow serving上 (TensorFlow Serving 系统用于在生产环境中运行模型) keras模型转 tenso ...
- 巨杉数据库 MySQL兼容项目正式开源
9月7日.8日,2018 ODF 开源数据库论坛,在北京盛大开幕.在大会上,巨杉数据库正式发布了巨杉全新的MySQL/MariaDB兼容架构,并将项目正式开源. 开源数据库论坛(ODF)是中国开源数 ...
- gcc:call to '__open_missing_mode' declared with attribute error
因为使用 open 函数的时候,如果在第二个参数中使用了 O_CREAT,就必须添加第三个参数:创建文件时赋予的初始权限.这个取决于 gcc 的版本,有的版本不会报这个错误. 解决办法: 找到源码中报 ...
- linux学习基础1
简介 包含计算机组成,发行.核心思想.主要目录,一些命令ifconfig.echo.tty.startx.export.pwd.history.shutdown.poweroff.reboot.hwc ...
- NLP入门(三)词形还原(Lemmatization)
词形还原(Lemmatization)是文本预处理中的重要部分,与词干提取(stemming)很相似. 简单说来,词形还原就是去掉单词的词缀,提取单词的主干部分,通常提取后的单词会是字典中的单 ...