编程经验点滴----在 Oracle 数据库中保存空字符串
寫程序這么多年,近幾天才發(fā)現(xiàn),向 Oracle 數(shù)據(jù)庫表中,保存空字符串 '' ,結(jié)果成了 null.
由于數(shù)據(jù)庫數(shù)值 null 的比較、判斷,與空字符串 '' 存在差異。一不留神,代碼中留下了 bug ,期望保存成空字符串 '' ,結(jié)果成了 null,SQL where 條件的結(jié)果 (a1.dls = a2.dls),與預(yù)想的不同(兩個(gè) null 不能用 = 進(jìn)行比較,而兩個(gè)空字符串 '' 可以用=進(jìn)行比較),導(dǎo)致查詢結(jié)果數(shù)據(jù)也不同。
查網(wǎng)上資料,發(fā)現(xiàn) Oracle 在空字符串 '' 的處理上,沒有遵循 SQL 標(biāo)準(zhǔn)(ANSI)的做法。
實(shí)測(cè) Oracle 11g 的 VARCHAR2 與VARCHAR兩個(gè)字符串字段類型,都是保存后數(shù)據(jù)成了 null。
未測(cè)試 CHAR 類型,因?yàn)檫@個(gè)不符合我們的業(yè)務(wù)實(shí)際要求。
嘗試翻閱各種網(wǎng)上文檔(主要使用 bing 及 yahoo 搜索引擎,本來喜歡 google 搜索,可惜現(xiàn)在用不了;百度搜索的技術(shù)文章排序有問題,前幾頁的文章質(zhì)量較低,沒法用),也未找到合適的解決辦法。
最后決定,在需要保存空字符串 '' 的地方,統(tǒng)一轉(zhuǎn)換成保存字符串 '-' 。僅對(duì)于我們當(dāng)前項(xiàng)目來說,是可以的。這也是無奈之舉。
畢竟這樣也能解決我們的問題。
這篇資料里有說: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 標(biāo)準(zhǔn)的字符串類型。
--2017/8/24 補(bǔ)充,
Oracle 網(wǎng)站上,截止到 Oracle database 12c r2 版本 ,仍舊如此。
網(wǎng)址:
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.
簡(jiǎn)單翻譯成中文,就是:
備注:
Oracle 數(shù)據(jù)庫當(dāng)前將長(zhǎng)度為零的字符串,當(dāng)成 null。然而,未來版本可能會(huì)改變。Oracle 建議你不要將空字符串與 null 等同對(duì)待(意思是要按 SQL 標(biāo)準(zhǔn),區(qū)別對(duì)待 SQL 空字符串及 SQL null)。
------------------------------------------------------------------------------------------------------------------------------------
類似/相關(guān)文章導(dǎo)航:
編程經(jīng)驗(yàn)點(diǎn)滴----避免在數(shù)據(jù)庫訪問函數(shù)中使用 try catch
http://www.cnblogs.com/jacklondon/archive/2012/05/04/2482659.html
編程經(jīng)驗(yàn)點(diǎn)滴----避免使用漢語拼音做變量名
http://www.cnblogs.com/jacklondon/archive/2012/05/03/2480609.html
編程經(jīng)驗(yàn)點(diǎn)滴----計(jì)算機(jī)軟件設(shè)計(jì)的幾個(gè)基本原則
http://www.cnblogs.com/jacklondon/p/3291829.html
------------------------------------------------------------------------------------------------------------------------------------
最近網(wǎng)站文章被其它網(wǎng)站抄襲嚴(yán)重,我不拒絕轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。
我是 Jacklondon Chen , @http://www.cnblogs.com/jacklondon/ , @ http://zheguisoft.com/ .
-----------------------------------------------------------------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的编程经验点滴----在 Oracle 数据库中保存空字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 返回指针的函数--指针函数 in
- 下一篇: 浦发信用卡VTM激活失败怎么办?找到原因