PostgreSQL去掉表中所有不可见字符

来源:互联网 发布:淘宝联盟红包很无耻 编辑:程序博客网 时间:2024/06/03 21:59

问题描述

数据库中的某些数据中包含了某些不可见字符。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)的不可见字符,见如下测试。

删除chr0测试
但oracle中上述语句却可以成功执行,见参考博文3。


参考

[1]. SQL Server 不可见字符处理
[2]. 字符串中的不可见字符应该如何清除?
[3]. Oracle中varchar2字段的不可见字符处理

1 1
原创粉丝点击