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應該是轉檔程式在不同系統間轉置資料所造成的,
至於什麼原因,因為已經不可考,所以就沒辦法知道是什麼原因造成的。
    0會員
    4內容數
    留言0
    查看全部
    發表第一個留言支持創作者!
    陳楨珽的沙龍 的其他內容
    Oracle動態密碼Redacted簡介
    閱讀時間約 6 分鐘
    你可能也想看
    區塊鏈技術在資料隱私保護上的優勢與挑戰!區塊鏈必懂資訊!區塊鏈究竟是什麼技術?用簡單的話解釋一下。 區塊鏈應用在供應鏈溯源、版權保護等領域有潛力。 區塊鏈技術的發展為數字身份認證帶來了新思路。 區塊鏈是加密貨幣等數字金融領域的核心技術。
    Thumbnail
    avatar
    02 teresaxp
    2023-07-28
    【你的文獻資料庫夠給力嗎?對於一個研究主題,收集50篇相關論文後,馬上就能在學術上取得的3大優勢】每個學術新手必犯的錯誤,就是文獻收集不夠。 新手常常會誤會自己的想法前無古人後無來者,以為自己的研究想法很有價值。然而,這都只是讀的文獻不夠多而已。一個有價值的想法,不僅需要深度和廣度,也需要大量的文獻來增加引用和提高說服力。 記得,豐富的文獻資源能讓你的觀點更具有說服力。
    Thumbnail
    avatar
    王啟樺
    2023-07-02
    歡迎下載地球資料庫! 活得精彩更新快;活得庸俗更新慢。 讓地球只為人類而活,萬物之靈不同意。地球只是活著的資料庫而已。 
而物種的增加與減少,就是地球活資料庫的增廣與縮編。 想與資料庫同步, 可以透過讀書、旅行去下載;創作、寫生去上傳。 當人類主宰了地球的資料庫更新,時間就會失去未來性,只剩下證明的功能而已。 才發現原因! 是萬物之靈,只想透過主宰,來證明自己。
    avatar
    始力拼達人
    2023-03-19
    0310 地方書寫的價值,在於立基資料的書寫觀點今天到大學聽一位講者分享地方志編輯經驗。這本地方志是地方政府招標,最後由在地團隊得標執行。會中主持人提到,從前地方志多由北部公關公司、顧問公司得標主導,這幾年越來越多在地人書寫地方歷史,是一件好事。 史官難為,更何況是僅一年餘的時間要完成一部地方志。聽完後的感想,個人思考了幾個層面。
    avatar
    時遇書店
    2023-03-10
    #012 縮表的歷史資料和現在的位置(更新於2022/5月)Howard Marks說過:知道未來很困難,了解現況卻沒那麼難,也許我們從不知道要去哪裡,但最好清楚了解我人在哪裡。因此想藉過去的歷史資料來觀察,我們現在在哪個位置。 1.縮表的程度 2.縮表對各資產的影響 (2)VT的2018整年跌幅為9.8% 3.緊縮到什麼時候
    Thumbnail
    avatar
    補教老師Eason的投資筆記
    2022-04-14
    資料科學家的工作日常1 - 在資料和程式中挖掘商業價值雖然數據分析師是新職位,但數據分析或是資料分析的概念一點都不新。公司裡面行之有年的職位,不管是行銷、業務、採購、倉管,每個職位都需要數據,也都需要分析。隨著大數據、資料科學、機器學習、AI等酷炫的新名詞、新技術與新應用出現,所需的知識與技能多到員工爆肝也學不完。
    avatar
    ARON HACK 亞倫害的
    2022-02-27
    不想畫畫,但又想在畫技上進步?來看看你腦海中的資料庫吧!我在學習人體速寫與結構時,老師曾說過,畫畫不是憑空想像出來的。更準確地說,所有天馬行空的幻想都建立於真實事物之上。 現在,來做個小測試,看看你腦海中的資料庫是否足夠豐富吧!
    Thumbnail
    avatar
    園丁與花插畫設計工作室
    2022-01-09
    弄半天,LINE Pay的資料都在海外!要不是上海LINE子公司出了個包,不會有新聞稿這個鉅細靡遺地列出所有Line服務細項內容,各是分別存在哪個國家的DC(Data Center) 先說明一下台灣支付卡交易流程。 如下圖,黑色框框就是在台灣本地的交易。依照新聞稿所描述,都是從韓國與日本的DC打回台灣然後在本地清算。
    Thumbnail
    avatar
    tcwhite
    2021-12-20
    在Dreamweaver中連結MySQL資料庫SETP1. 開起Dreamweaver,執行【網站>新增網站】定義使用PHP 的網站,除設定『本機網站資料夾』外,於『伺服器』設定中,設定『伺服器連線方式:本機/ 網路』、『伺服器資料夾』,按下『進階』設定『伺服器式:PHP MySQL』。 STEP2. 連結資料庫,新增空白練習頁面並儲存檔案,
    Thumbnail
    avatar
    哩老師
    2020-05-11
    數據分析師的工作日常,在資料和程式中挖掘商業價值雖然數據分析師是新職位,但數據分析或是資料分析的概念一點都不新。公司裡面行之有年的職位,不管是行銷、業務、採購、倉管,每個職位都需要數據,也都需要分析。隨著大數據、資料科學、機器學習、AI等酷炫的新名詞、新技術與新應用出現,所需的知識與技能多到員工爆肝也學不完。
    Thumbnail
    avatar
    ARON HACK 亞倫害的
    2020-03-08