编程经验点滴----在 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):在一个表中能唯一的标识一行.主键可 ...
随机推荐
- SaltStack安装配置详解
一.简介 Saltstack 比 Puppet 出来晚几年,是基于Python 开发的,也是基于 C/S 架构,服务端 master 和客户端 minions :Saltstack 和 Puppet ...
- [CF960G] Bandit Blues
题意 给你三个正整数 \(n,a,b\),定义 \(A\) 为一个排列中是前缀最大值的数的个数,定义 \(B\) 为一个排列中是后缀最大值的数的个数,求长度为 \(n\) 的排列中满足 \(A = a ...
- 翻译:replace into语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:REPLACE INTO的译文. 原文:https://mariadb.com/kb/en/replace/ 我提交到MariaDB官方手册的译文:https://mar ...
- [转]git图解(3):分支操作
本文转自:https://www.jianshu.com/p/342a9f8db004 title_img.png git 的分支是它最明显的特性, 大部分人听别人推荐使用git都会听到“git分 ...
- iis访问网络路径映射问题(UNC share)
最近在做一个功能,涉及到nas网络磁盘文件的保存和访问,在服务器上将对应的路径映射为Z盘,结果在iis上部署网站直接访问该路径,报无法找到该路径的错误. 用的是.net core开发,在vs直接启动程 ...
- [angularjs] angularjs系列笔记(三)模型
ng-model指令 ng-model可以将输入域的值与AngularJs的变量绑定 双向绑定 当修改输入域的值时候,AngularJs属性的值也将修改 <div ng-app="Ho ...
- 44.Linux君正X1000-添加st7789v显示
由于板子LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使用一个st7789v型号的LCD 它们两个屏的区别在于初始化屏的参数不同,引脚都一样,也就是说需要使板子同时支持ili9335型 ...
- Codeforces Round #309 (Div. 2)
A. Kyoya and Photobooks Kyoya Ootori is selling photobooks of the Ouran High School Host Club. He ha ...
- Java编程思想__内部类
1.对象.new语法 类结构 public class Outer { public String oName; class Inner { public String iName; public v ...
- linux查看用户、创建用户、设置密码、修改用户、删除用户命令
查看用户 /etc/passwd /etc/shadow id alex ' |passwd --stdin alex # 设置密码,不需要交互 [root@localhost ~]# tail -l ...