加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 17:02:25 所属栏目:百科 来源:网络整理
导读:问题描述 数据库中的某些数据中包含了某些不可见字符。ASCII码中的0-31,127属于控制字符,不可见,详情见wiki–控制字符。 这些不可见字符往往是不需要的,我们要想办法删除它。 解决办法 写一函数,将所有字段中的不可见字符替换为空格。 测试流程 环境准备

问题描述

数据库中的某些数据中包含了某些不可见字符。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字段的不可见字符处理

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读