Ascii 0 在資料庫上造成的困擾

更新於 發佈於 閱讀時間約 4 分鐘

今天在工作時遇到一件奇怪的問題,

user反映明明欄位開了CHAR(6 byte),但裡面的文字卻只呈現5個byte,使用length去算整個欄位長度,卻顯示是6,

好吧,就來查查看是遇到甚麼問題了。

select dump(BEFORECOSIGNEREMPNO) from A.test
where NURSEGIVEDRUGIDSE IN (289839402,289769909) AND BEFORECOSIGNEREMPNO IS not NULL;
-------------------------------------
Typ=96 Len=6: 0,0,0,0,10,0
Typ=96 Len=6: 80,48,48,50,55,0

看這兩筆資料,很明顯最後一個byte被塞了acciss碼0的字元,

ascii中0代表 空字元 Null character,

理論上,文字欄位不應該有文字後又加了一個null字元,

也難怪套上oracle nvl()來檢查,還真的不會回應任何對應的欄位,

我們來看,真正欄位值為null時的asscii應該是什麼?

create table test1
as 
select * from dual;
alter table test1
add a varchar2(1 byte);
insert into test1
select 'x',null from dual;
commit;
select dump(a) from test1;
-------------------------------------
Typ=1 Len=1: 49
NULL

從上面的測試我們知道,真正的NULL欄位dump出來的質應該是NULL,而不是0,

當你程式把null 的ascii值 0 給塞進資料庫裡,對資料庫來說,這個時候欄位有ascii 值,資料庫就不認為是NULL了。

--我們手動塞一個ascii 為0的值到資料庫中(ascii 0 : Null)
update test1 set a=chr(0) where dummy='x';   
commit;
select dump(a),nvl(a,'is null'),a.* from test1 a;
-------------------------------------
Typ=1 Len=1: 49    1    X    1
Typ=1 Len=1: 0            x

上面的測試很清楚知道,ascii 0 其實還是有字符的,只是這個字符代表的是null,但對資料庫的欄位來說,欄位不是null的,很繞口對吧?

那空白呢?

我們也來順便測試一下

--我們塞一個ascii 32 來當成空白
insert into test1
select 'y',chr(32) from dual;     

--我們塞一個空白字元進去
insert into test1
select 'y',' ' from dual;             

commit;
select dump(a),length(a),a.* from test1 a where dummy='y';
-------------------------------------
Typ=1 Len=1: 32    1    y     
Typ=1 Len=1: 32    1    y

這邊實驗的結果,我們可以發現,輸入空白,ascii碼為 32,跟你使用chr(32)的方式是一樣的,

所以ascii空白對資料庫來說,就是空白。

估計這個ascii應該是轉檔程式在不同系統間轉置資料所造成的,

至於什麼原因,因為已經不可考,所以就沒辦法知道是什麼原因造成的。



留言
avatar-img
留言分享你的想法!
avatar-img
陳楨珽的沙龍
0會員
4內容數
陳楨珽的沙龍的其他內容
2024/01/31
Oracle可以透過Flashback TABLE將已經commit後的誤刪、誤異動資料給救回來(回到誤異動前的時間點),下面就是整個操作過程。 SQL> select systimestamp from dual; systimestamp ----------------------
2024/01/31
Oracle可以透過Flashback TABLE將已經commit後的誤刪、誤異動資料給救回來(回到誤異動前的時間點),下面就是整個操作過程。 SQL> select systimestamp from dual; systimestamp ----------------------
2023/10/24
最近在做系統轉碼,結果使用了secureCRT連線使用vi後,使用root登入使用vi卻都正常,換成user登入會發現, 在控制列使用控制命令時(ex: i (insert)), 都會有亂碼跑出來,找了好久問題終於發現是linux locate 中的編碼與secureCRT編碼設定不同, linux
Thumbnail
2023/10/24
最近在做系統轉碼,結果使用了secureCRT連線使用vi後,使用root登入使用vi卻都正常,換成user登入會發現, 在控制列使用控制命令時(ex: i (insert)), 都會有亂碼跑出來,找了好久問題終於發現是linux locate 中的編碼與secureCRT編碼設定不同, linux
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
Thumbnail
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
Thumbnail
在 kotlin 程式語言中,定義資料類型,最後加上問號「?」,則表示此筆資料可為空,可以指定 null 值。
Thumbnail
在 kotlin 程式語言中,定義資料類型,最後加上問號「?」,則表示此筆資料可為空,可以指定 null 值。
Thumbnail
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
Thumbnail
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
Thumbnail
UTF-8 萬國碼在規格定義時,有建議在文件的開始處,加入位元組順序記號 (BOM, byte-order mark)。但 Plain Text 文件,就是全部都是文字,將它加入檔頭標記,就不是純文字檔案了,所以一般都沒有實作成有 BOM 檔頭的檔案。
Thumbnail
UTF-8 萬國碼在規格定義時,有建議在文件的開始處,加入位元組順序記號 (BOM, byte-order mark)。但 Plain Text 文件,就是全部都是文字,將它加入檔頭標記,就不是純文字檔案了,所以一般都沒有實作成有 BOM 檔頭的檔案。
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
如果你 WHERE 的條件需要常常更動,但每次都要進去 QUERY 所在的儲存格編輯語法,實在是有點太麻煩了?但其實有個小技巧,可以讓 QUERY 更新得更輕鬆。來看看吧!
Thumbnail
如果你 WHERE 的條件需要常常更動,但每次都要進去 QUERY 所在的儲存格編輯語法,實在是有點太麻煩了?但其實有個小技巧,可以讓 QUERY 更新得更輕鬆。來看看吧!
Thumbnail
進入目錄、列出目錄列表、讀取檔案內容、寫入檔案(資料)、變更檔案名稱、刪除檔案、目錄內新增檔案、變更目錄名稱、刪除目錄
Thumbnail
進入目錄、列出目錄列表、讀取檔案內容、寫入檔案(資料)、變更檔案名稱、刪除檔案、目錄內新增檔案、變更目錄名稱、刪除目錄
Thumbnail
常常會遇到好不容易寫好程式,但是輸出的時候沒辦法按照自己想要的格式,或是間隔來輸出,這時需要用到的就是格式化輸出,格式化輸出就是調整排版的一個形式。
Thumbnail
常常會遇到好不容易寫好程式,但是輸出的時候沒辦法按照自己想要的格式,或是間隔來輸出,這時需要用到的就是格式化輸出,格式化輸出就是調整排版的一個形式。
Thumbnail
輸入畫面 為什麼要做驗證? 因為作為設計者,永遠不該預設使用者會乖乖照設計者的意思輸入。
Thumbnail
輸入畫面 為什麼要做驗證? 因為作為設計者,永遠不該預設使用者會乖乖照設計者的意思輸入。
Thumbnail
在Python中使用MySQLdb的起手式大概長這樣。記得execute裡面的SQL語法一定要加上冒號,否則會出錯。我也在這個愚蠢的錯誤上跌倒過。編碼問題是資料庫管理中常見的問題,編碼包含又包含了兩個部份,collation和character set。
Thumbnail
在Python中使用MySQLdb的起手式大概長這樣。記得execute裡面的SQL語法一定要加上冒號,否則會出錯。我也在這個愚蠢的錯誤上跌倒過。編碼問題是資料庫管理中常見的問題,編碼包含又包含了兩個部份,collation和character set。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News