揪出資料庫中看不見的字元

2021-10-17 08:03:35 字數 3260 閱讀 9509

應用報出了異常,發現某錶某字段下的資料多了些字元,但是在資料庫中用sql檢視時不一定能夠發現。這種情況一般是在字元結尾多了空格、製表符、回車符、換行符等造成。可以從資料庫中校驗並修正這些異常資料。

特殊字元ascii碼,oracle和mysql中的表示方法:

特殊符號

oracle

mysql

tidb

空格chr(32)

char(32)

char(32)

製表符chr(9)

char(9)

char(9)

回車符chr(13)

char(13)

char(13)

換行符chr(10)

char(10)

char(10)

更多ascii碼可參考

oracle中可以用ascii函式檢視對應的ascii碼:

select ascii(' ') from dual;

32select ascii('&') from dual;

38

mysql中也有對應的函式:

select ascii(' ');

+------------+

| ascii(' ') |

+------------+

| 32 |

+------------+

select ascii('&');

+------------+

| ascii('&') |

+------------+

| 38 |

+------------+

建立測試資料:

oracle 11.2測試表:

create table test_char (

id int,

name varchar2(50),

note varchar2(50)

);

mysql 5.7、tidb 3.0測試表:

drop table test_char;

create table test_char (

id int,

name varchar(50),

note varchar(50)

) ;

分別在不同型別資料庫中插入測試資料:

--oracle

insert into test_char values (1,'0123456789 ','空格');

insert into test_char values (2,'0123456789'||chr(9),'製表符');

insert into test_char values (3,'0123456789'||chr(10),'回車符');

insert into test_char values (4,'0123456789'||chr(13),'換行符');

commit;

--mysql/tidb

insert into test_char values (1,'0123456789 ','空格');

insert into test_char values (2,concat('0123456789',char(9)),'製表符');

insert into test_char values (3,concat('0123456789',char(10)),'回車符');

insert into test_char values (4,concat('0123456789',char(13)),'換行符');

--oracle中檢查出異常資料

select id,name,length(name),note,

case when name like '% %' then '有空格'

when name like '%'||chr(9)||'%' then '有製表符'

when name like '%'||chr(13)||'%' then '有換行符'

when name like '%'||chr(10)||'%' then '有回車符'

從檢查結果中可以看出,name欄位中期望的是10個字元,length函式檢查出來是11個字元,多了乙個看不見的字元,通過like匹配,檢查出對應的特殊字元。

--mysql/tidb中檢查異常資料

select id,name,length(name),note,

case when name like '% %' then '有空格'

when name like concat('%',char(9),'%') then '有製表符'

when name like concat('%',char(13),'%') then '有換行符'

when name like concat('%',char(10),'%') then '有回車符'

從mysql/tidb檢查結果中看到,和oracle一樣,name欄位中期望的是10個字元,length函式檢查出來是11個字元,多了乙個看不見的字元,通過like匹配,檢查出對應的特殊字元。

--使用replace函式替換掉多餘的特殊字元

--oracle

update test_char set name =replace(name,chr(9),'');

update test_char set name =replace(name,chr(10),'');

update test_char set name =replace(name,chr(13),'');

--mysql/tidb

update test_char set name =replace(name,char(9),'');

update test_char set name =replace(name,char(10),'');

update test_char set name =replace(name,char(13),'');

C 中看不見的臨時物件

物件導向的程式語言中涉及到物件的建立與銷毀,其中有建構函式與析構函式的呼叫,在建立物件 值拷貝物件等過程中,編譯器會隱含建立一些原始碼中沒有的臨時物件,如果不注意,這些臨時物件會給程式的效能帶來很大的影響。下面介紹二種常見的臨時物件產生環境並給出解決方案 1 當函式返回乙個物件時,一般情況下會出現臨...

小技巧 用看不見的字元分隔資料

小技巧 用看不見的字元分隔資料 處理文字時,偶而會需要將類似的東西串在資料庫 的乙個欄位裡或文字檔的一行文字裡。為了避免分隔符號和別的文字衝到,從同事 p 那學到乙個不錯的小技巧 用看不見的字元分隔,比方說 unicode 的 1 5 等。用 python 寫就是 u0001 用 mysql 則是 ...

看不見 沒乾 淺述你所不了解的英特爾大資料

zdnet至頂網伺服器頻道 12月23日 新聞訊息 文 於澤 提到英特爾,你的第一反應是什麼?處理器 ssd還是網絡卡。如果你能想到這些,起碼算半個圈裡人,這些都是英特爾最終呈現出來的產品,也可以說是其相當大一部分產品。不過除了這些看得見摸得著的產品,還有很多使用者看不見的,本文就簡單聊聊英特爾在大...