Oracle ascii為0的陷阱

2022-02-18 09:34:49 字數 1744 閱讀 5798

ascii0是個空字元,如果將這個字元插入到oracle資料庫中會是什麼現象,是null嗎?

建立一張測試表

create table test(id int, name varchar2(10), comm varchar2(30));

向這張測試表中插入以下資料

insert into test values(1, null, 'null'); --直接插入null

insert into test values(2, '', 'empty string'); --插入空字元

insert into test values(3, ' ', 'blank space'); --插入空格

insert into test values(4, chr(0), 'ascii0'); --插入ascii為0的字元

查測試表,可以看到第2列似乎都是空的

sql> select * from test;

id name comm

------ ---------- ---------------

1 null

2 empty string

3 blank space

4 ascii0

檢視第2列不為空值的行

sql> select * from test where name is not null;

id name comm

------ ---------- ---------------

3 blank space

4 ascii0

加trim函式再查

sql> select * from test where trim(name) is not null;

id name comm

------ ---------- ---------------

4 ascii0

可以看到第4行的第2列跟第3行的第2列的空格一樣,都是佔了乙個位元組,而且他的ascii碼為0,那麼我們可以通過下面的方式將第4行查出來

sql> select * from test where name = chr(0);

id name comm

------ ---------- ---------------

4 ascii0

ascii為0插入到oracle中,並不是null,它占用乙個位元組,要查詢出來只能用=chr(0)

盡量別插入ascii為0的字元到資料庫中,可以用插入空字串或者null代替,否則檢索起來不方便

碰到實在是不知道這個字段到底存的是什麼的時候,可以使用dump函式去檢視它具體的ascii碼

這裡分享下這個實驗的由來。

因為要對比兩個庫的同一張表的資料差異性,表資料量不大,而且僅相差三條資料,肉眼看肯定不靠譜,很自然的就想到在乙個庫上建一張臨時表,將另外乙個庫的這張表導過來,然後做個minus。但minus出來的結果竟然是第一張表的所有行,當時氣氛一度很尷尬。

後面經過仔細分析,才發現原來是chr(0)在搞鬼,通過工具匯出chr(0)的時候,它會自動轉換成null,然而資料庫中chr(0)並不是null,也就是說匯出來再導進去的資料已經跟原始表的資料不一樣了。

jquery mobile AJAX特性的陷阱

簡單情況是 mvc 重定向,url不變 試了n種方式,跳來跳去,無解,服務端跳,寫js跳,生成跳轉中間頁跳。失敗 後來一看,明明已經跳到新頁了,樣式什麼還是原頁的,有點火大了。出去溜一圈,喝杯水,和同事東拉西扯一通。回頭一看,突然反應過來,這不是ajax的效果麼,坑我半個多小時。為加驗證,是手動呼叫...

setTimeout為0的作用

但settimeout f,0 的作用很簡單,就是為了把f放到執行佇列的最後去執行。也就是說,無論settimeout f,0 寫在哪,都可以保證在佇列的最後執行。js解析器會把settimeout f,0 裡的f壓到佇列的最後,因為它是非同步操作。settimeout第二個引數為0表示立即執行。當...

陣列下標為0

長度為0的陣列 c語言的非標準用法之一 在標準c和c 中,長度為0的陣列是被禁止使用的。不過在gnu c中,存在乙個非常奇怪的用法,那就是長度為0的陣列,比如array 0 很多人可能覺得不可思議,長度為0的陣列是沒有什麼意義的,不過在這兒,它表示的完全是另外的一層意思,這個特性是不可移植的,所以,...