问题描述
数据库中的某些数据中包含了某些不可见字符。ASCII码中的0-31,127属于控制字符,不可见,详情见wiki–控制字符。
这些不可见字符往往是不需要的,我们要想办法删除它。
解决办法
写一函数,将所有字段中的不可见字符替换为空格。
测试流程
环境准备
建表,并插入带不可见字符的记录。注:下列数据中的不可见字符在粘贴过来的时候自动去掉了,请按ALT
+数字键
加入。
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
代替。实际上在其它地方可以用ALT+数字键
打印出来。
去掉表中所有的不可见字符
-- 函数说明:将表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;
执行函数
执行函数–select * from delete_special_char()
,之后查看表数据,所有的不可见字符都被替换为空格。
补充–如何删除chr(0)
值得注意的是上述函数并不能删除chr(0)
的不可见字符,见如下测试。
但oracle中上述语句却可以成功执行,见参考博文3。
参考
[1]. SQL Server 不可见字符处理
[2]. 字符串中的不可见字符应该如何清除?
[3]. Oracle中varchar2字段的不可见字符处理