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


问题描述

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

PostgreSQL去掉表中所有不可见字符_第1张图片
但oracle中上述语句却可以成功执行,见参考博文3。


参考

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

你可能感兴趣的:(PostgreSQL)