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
    0會員
    4內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    你可能也想看
    Google News 追蹤
    Thumbnail
    嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
    在處理數據時,最可能會遇到數據中含有None的時候,若沒有處理就進行運算就會造成程式崩潰或者報錯 數據中含有None input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None
    Thumbnail
    本篇文章講解了字符編碼的基礎知識,包括ASCII, Unicode 和 UTF-8的誕生背景、解決的問題以及轉換方式。瞭解這些知識有助於解決在讀檔案時用錯誤的編碼方式轉換就會出現亂碼等問題。文章內容涉及電腦技術中的字符編碼相關歷史緣由,可幫助讀者解決相關疑問。
    Thumbnail
    許多人會使用EXCEL來管理股票的損益,但會發現輸入股票時,有的股票前面的0會消失有的卻不會消失,而且消失的0想要手動KEY回去,他又自己離奇的不見。 主要的原因是:EXCEL的儲存格會把數字沒有意義的0都去除不顯示,所以存數字的股票代號前面的0就都會消失的無影無蹤,但如果股票代號含有非數字字元,
    Thumbnail
    當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
    Thumbnail
    在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
    若然我在這片白紙上寫下片言隻語的話,豈不經已離題?
    空白的文字檔案 是為了誰而留 思想劃過 卻不會為我而留   被選取的文字 被刪除了意義 好像 為了生存而存在的感覺   嘲笑完美 像是個不存在的神話 卻彌留於 曾經握在手掌上的靈感   曾經見過的所有事物 列舉在我的文章 像是摧毀了一切 虛偽 欺騙   我像是
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們在原有的資料表上,將所有在欄位quantity的缺失值填補為0。 題目的原文敘述 測試範例 Example 1: Input:+-----------------+----------+-------+ | nam
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表name欄位為檢查基準,刪除有缺失值None的 data rows。 題目的原文敘述 測試範例 Example 1: Input: +------------+---------+-----+ | s
    Thumbnail
    嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
    在處理數據時,最可能會遇到數據中含有None的時候,若沒有處理就進行運算就會造成程式崩潰或者報錯 數據中含有None input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None
    Thumbnail
    本篇文章講解了字符編碼的基礎知識,包括ASCII, Unicode 和 UTF-8的誕生背景、解決的問題以及轉換方式。瞭解這些知識有助於解決在讀檔案時用錯誤的編碼方式轉換就會出現亂碼等問題。文章內容涉及電腦技術中的字符編碼相關歷史緣由,可幫助讀者解決相關疑問。
    Thumbnail
    許多人會使用EXCEL來管理股票的損益,但會發現輸入股票時,有的股票前面的0會消失有的卻不會消失,而且消失的0想要手動KEY回去,他又自己離奇的不見。 主要的原因是:EXCEL的儲存格會把數字沒有意義的0都去除不顯示,所以存數字的股票代號前面的0就都會消失的無影無蹤,但如果股票代號含有非數字字元,
    Thumbnail
    當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
    Thumbnail
    在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
    若然我在這片白紙上寫下片言隻語的話,豈不經已離題?
    空白的文字檔案 是為了誰而留 思想劃過 卻不會為我而留   被選取的文字 被刪除了意義 好像 為了生存而存在的感覺   嘲笑完美 像是個不存在的神話 卻彌留於 曾經握在手掌上的靈感   曾經見過的所有事物 列舉在我的文章 像是摧毀了一切 虛偽 欺騙   我像是
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們在原有的資料表上,將所有在欄位quantity的缺失值填補為0。 題目的原文敘述 測試範例 Example 1: Input:+-----------------+----------+-------+ | nam
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表name欄位為檢查基準,刪除有缺失值None的 data rows。 題目的原文敘述 測試範例 Example 1: Input: +------------+---------+-----+ | s