您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么在PostgreSQL數(shù)據(jù)庫中去掉表中不可見的字符,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
數(shù)據(jù)庫中的某些數(shù)據(jù)中包含了某些不可見字符。ASCII碼中的0-31,127屬于控制字符,不可見。
這些不可見字符往往是不需要的,我們要想辦法刪除它。
寫一函數(shù),將所有字段中的不可見字符替換為空格。
環(huán)境準(zhǔn)備
建表,并插入帶不可見字符的記錄。注:下列數(shù)據(jù)中的不可見字符在粘貼過來的時(shí)候自動(dòng)去掉了,請(qǐng)按ALT+數(shù)字鍵加入。
CREATE TABLE public.test_table ( xm character varying(50), pinyin character varying(200), sm character(15) ) WITH ( OIDS=FALSE ); ALTER TABLE public.test_table OWNER TO postgres; -- ---------------------------- -- Records of test_table -- ---------------------------- INSERT INTO ry_syrk_copy VALUES ('周小星xx', 'xx測試','測試' ); INSERT INTO ry_syrk_copy VALUES ('李華', '測試xx','世xx界' );
注:因不可見字符無法在CSDN中無法打出,故用xx代替。實(shí)際上在其它地方可以用ALT+數(shù)字鍵打印出來。
-- 函數(shù)說明:將表test_table中所有的不可見字符替換掉 CREATE OR REPLACE FUNCTION delete_special_char() RETURNS int8 AS $$ DECLARE row RECORD; BEGIN -- 查詢表中所有類型為字符串的列 FOR row in select column_name from information_schema.columns where table_name = 'test_table' and data_type like 'character%' LOOP FOR i IN 1..31 LOOP --替換所有的不可見字符為空格(除了chr(0)之外) EXECUTE 'update test_table set ' || row.column_name || ' = replace(' || row.column_name || ', chr(' || i || '), '' '' )'; END LOOP; END LOOP; RETURN 1; END; $$ LANGUAGE plpgsql;
執(zhí)行函數(shù)–select * from delete_special_char(),之后查看表數(shù)據(jù),所有的不可見字符都被替換為空格。
值得注意的是上述函數(shù)并不能刪除chr(0)的不可見字符,見如下測試。
但oracle中上述語句卻可以成功執(zhí)行,下面我就來講一講吧~
Oracle中varchar2字段的不可見字符處理
在以前的項(xiàng)目中,曾經(jīng)出現(xiàn)加密后的字符串?dāng)?shù)據(jù)丟失,加密內(nèi)容無法正常解密的情況,經(jīng)查找原因,發(fā)現(xiàn)是數(shù)據(jù)庫表的varchar2字段中有chr(0)的不可見字符(即我們通常所說的\0),當(dāng)出現(xiàn)這種情況時(shí),由于java和c++中對(duì)字符串處理的不同,將會(huì)導(dǎo)致所取得的字符串長度不同。
在java中,字符串的長度可以通過取字符串的字節(jié)數(shù)組來獲得,這樣得到的字符串長度為字符串實(shí)際的大小(漢字2個(gè)字節(jié),其他1個(gè)字節(jié));在c++中通過strlen函數(shù)獲得的字符串長度為第一個(gè)字節(jié)\0之前的字符長度。
當(dāng)我們?cè)诰帉慾ni的時(shí)候,經(jīng)常會(huì)遇到將java的字符串轉(zhuǎn)換為c++中的字符串的情況,這樣,當(dāng)java中的字符串包含\0的空字節(jié)時(shí),在對(duì)c++轉(zhuǎn)換后的字符串求取長度時(shí),不要使用strlen函數(shù),否則,其僅僅對(duì)\0字節(jié)之前的內(nèi)容求取長度,與實(shí)際大小不同。
在數(shù)據(jù)庫層解決:
Oracle數(shù)據(jù)庫中,可在查詢語句中使用函數(shù)replace來去除字符串中的非可見字符,例如:
select replace(content,chr(0),null) from bossquery_request where sky_command = '02';
以后大家如果遇到類似情況,可通過replace(字段名,chr(ASCII碼值),null)來去掉其中對(duì)應(yīng)的ASCII碼值的字符。
在java程序中解決:
在java程序中,大家可通過獲取String對(duì)象的所有字節(jié)內(nèi)容,對(duì)字節(jié)內(nèi)容進(jìn)行掃描,來去掉其中不需要的字節(jié)。
在JNI層解決:
在JNI層解決該問題的方式是,不要使用strlen函數(shù)來獲取字符串長度,可通過GetArrayLength取字節(jié)數(shù)組長度函數(shù)或者其他類似函數(shù)來獲取字符串長度,則可避免該情況發(fā)生。
上述內(nèi)容就是怎么在PostgreSQL數(shù)據(jù)庫中去掉表中不可見的字符,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。