编程经验点滴----在 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):在一个表中能唯一的标识一行.主键可 ...
随机推荐
- SQL中EXPLAIN命令详解
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- 【jQuery】(5)---jQuery CSS
jQuery CSS 1.jQuery 文档操作方法 1.addClass() 方法: addClass() 方法向被选元素添加一个或多个类.该方法不会移除已存在的 clas ...
- C# 算法之选择排序
1.简介 选择排序是排序中比较简单的一种,实现的大致思路如下:首先我们拿到一个需要排序的数组,假设该数组的第一个元素是最小的,然后将数组中剩下的元素,于最小的元素进行比较,如果中间有比第一个元素的小的 ...
- Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
Jeff Lee blog: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),retain the url when reproduced ! Thanks ...
- Deploying Keras model on Tensorflow Serving--
keras训练了个二分类的模型.需求是把keras模型跑到 tensorflow serving上 (TensorFlow Serving 系统用于在生产环境中运行模型) keras模型转 tenso ...
- docker使用ssh远程连接容器(没钱买服务器又不想安装虚拟机患者必备)
突然有需求,需要使用go语言写个ssh终端连接功能,这时候手上又没有服务器,虚拟机也没有,正好使用docker搞起来 docker容器开启sshd服务,模拟服务器 我们知道docker是可以用exec ...
- 第5章 Linux上管理文件系统
5.1 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
- 网络扫描工具nmap
nmap一般就用来扫描主机是否在线(特别是扫描局域网内存活的机器).开放了哪些端口.其他的功能用的比较少,做渗透的人可能要了解的多些. 1.1 选项说明 nmap需要自行安装. shell> y ...
- vb.net 使用NPO各種格式設定
'導入命名空間Imports System.IO Imports NPOI.HSSF.UserModelImports NPOI.HPSFImports NPOI.POIFS.FileSystem P ...
- 修改tomcat命令黑窗口的名字
一.为什么要修改tomcat黑窗口的名字 同时启动多个tomcat时,不好区分,而给tomcat的命令窗口取名区分是个不错的选择,例如下面这个效果. 二.修改的方法 1.找到tomcat的bin目录下 ...