應用報出了異常,發現某錶某字段下的資料多了些字元,但是在資料庫中用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;mysql中也有對應的函式:32select ascii('&') from dual;
38
select ascii(' ');建立測試資料:+------------+
| ascii(' ') |
+------------+
| 32 |
+------------+
select ascii('&');
+------------+
| ascii('&') |
+------------+
| 38 |
+------------+
oracle 11.2測試表:
create table test_char (mysql 5.7、tidb 3.0測試表:id int,
name varchar2(50),
note varchar2(50)
);
drop table test_char;分別在不同型別資料庫中插入測試資料:create table test_char (
id int,
name varchar(50),
note varchar(50)
) ;
--oracle--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)),'換行符');
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函式替換掉多餘的特殊字元
--oracleupdate 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還是網絡卡。如果你能想到這些,起碼算半個圈裡人,這些都是英特爾最終呈現出來的產品,也可以說是其相當大一部分產品。不過除了這些看得見摸得著的產品,還有很多使用者看不見的,本文就簡單聊聊英特爾在大...