postgresql中控制符带来的数据错觉

简介

在数据库字符集中,由于数据质量的控制不够完善,每一个字符集都并不是所有字符的能看见,有些字符的展示可能会出现乱码,甚至出现不同字符展示成同样效果的可能,给开发人员造成分析错觉。
当数据库存入了控制符,类似制表符,展示的效果竟然和空格效果一样,而且还无法trim掉,对于开发人员可能会带来视觉错觉。

错觉展示

此时表中存入了一个制表符,展示看着是空格,而且长度为1,展示的效果与空格一样,常人根本无法一眼看出问题所在,如果用在表关联中还会导致数据无法关联上。
b59bff5b3a052ca818490eb5f65eb75.png

控制符介绍

Seq十进十六进缩写字符名
00x00NULNull (空)
^A10x01SOHStart of Heading (报头开始)
^B20x02STXStart of Text (正文开始)
^C30x03ETXEnd of Text (正文结束)
^D40x04EOTEnd of Transmission (传输结束)
^E50x05ENQEnquiry (查询)
^F60x06ACKAcknowledge (确认)
^G70x07BELBell (振铃)
^H80x08BSBackspace (退格)
^I90x09HTHorizontal Tab (水平制表)
^J100x0ALFLine Feed (换行)
^K110x0BVTVertical Tab (垂直制表)
^L120x0CFFForm Feed (换页)
^M130x0DCRCarriage Return (回车)
^N140x0ESOShift Out (移出)
^O150x0FSIShift In (移入)
^P160x10DLEData Link Escape (数据链路转义)
^Q170x11DC1Device Control 1 (设备控制1)
^R180x12DC2Device Control 2 (设备控制2)
^S190x13DC3Device Control 3 (设备控制3)
^T200x14DC4Device Control 4 (设备控制4)
^U210x15NAKNegative Acknowledge (否认)
^V220x16SYNSynchronous Idle (同步空闲)
^W230x17ETBEnd of Transmission Block (传输块结束)
^X240x18CANCancel (取消)
^Y250x19EMEnd of Medium (介质结束)
^Z260x1ASUBSubstitute (替换)
^[270x1BESCEscape (转义)
^|280x1CFSFile Separator (文件分隔符)
^]290x1DGSGroup Separator (分组符)
^^300x1ERSRecord Separator (记录分隔符)
^_310x1FUSUnit Separator (单元分隔符)
1270x7FDELDelete (删除)
插入控制符

此时我将控制符插入到表中去,展示看看控制符在数据库中呈现效果。

 DROP TABLE IF EXISTS public.hf;CREATE TABLE public.hf (十进制编码 varchar NULL,十六进制编码 varchar NULL,缩写 varchar NULL,字符名 varchar NULL,展示效果 varchar NULL
);

插入数据

-- insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '0','0x00','NUL','Null (空)',E'\x00';   --  该编码无法插入到数据库中,暂时不参与讨论
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '1','0x01','SOH','Start of Heading (报头开始)',E'\x01';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '2','0x02','STX','Start of Text (正文开始)',E'\x02';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '3','0x03','ETX','End of Text (正文结束)',E'\x03';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '4','0x04','EOT','End of Transmission (传输结束)',E'\x04';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '5','0x05','ENQ','Enquiry (查询)',E'\x05';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '6','0x06','ACK','Acknowledge (确认)',E'\x06';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '7','0x07','BEL','Bell (振铃)',E'\x07';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '8','0x08','BSB','ackspace (退格)',E'\x08';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '9','0x09','HTH','orizontal Tab (水平制表)',E'\x09';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '10','0x0A','LF','Line Feed (换行)',E'\x0A';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '11','0x0B','VT','Vertical Tab (垂直制表)',E'\x0B';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '12','0x0C','FF','Form Feed (换页)',E'\x0C';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '13','0x0D','CR','Carriage Return (回车)',E'\x0D';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '14','0x0E','SO','Shift Out (移出)',E'\x0E';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '15','0x0F','SI','Shift In (移入)',E'\x0F';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '16','0x10','DLE','Data Link Escape (数据链路转义)',E'\x10';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '17','0x11','DC1','Device Control 1 (设备控制1)',E'\x11';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '18','0x12','DC2','Device Control 2 (设备控制2)',E'\x12';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '19','0x13','DC3','Device Control 3 (设备控制3)',E'\x13';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '20','0x14','DC4','Device Control 4 (设备控制4)',E'\x14';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '21','0x15','NAK','Negative Acknowledge (否认)',E'\x15';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '22','0x16','SYN','Synchronous Idle (同步空闲)',E'\x16';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '23','0x17','ETB','End of Transmission Block (传输块结束)',E'\x17';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '24','0x18','CAN','Cancel (取消)',E'\x18';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '25','0x19','EM','End of Medium (介质结束)',E'\x19';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '26','0x1A','SUB','Substitute (替换)',E'\x1A';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '27','0x1B','ESC','Escape (转义)',E'\x1B';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '28','0x1C','FS','File Separator (文件分隔符)',E'\x1C';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '29','0x1D','GS','Group Separator (分组符)',E'\x1D';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '30','0x1E','RS','Record Separator (记录分隔符)',E'\x1E';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '31','0x1F','US','Unit Separator (单元分隔符)',E'\x1F';
insert into hf(十进制编码,十六进制编码,缩写,字符名,展示效果)select '127','0x7F','DEL','Delete (删除)',E'\x7F';

查看数据库展示效果

select a.*,length(展示效果) ,length(trim(展示效果)) from  hf a  

image.png

部分控制符展示为NULL 实际上占用有一个字节长度,使用trim去空实际上并无法去掉。

解决办法

首先最优解还是需要在数据输入端,严格规范的控制数据录入的质量。
如果诸如此类控制符仍然被录入表中,多数情况需要人工发现,
对其进行替换掉

select a.*,length(展示效果) ,length(trim(展示效果)),regexp_replace(展示效果, '[[:cntrl:]]', '', 'g') ,length(regexp_replace(展示效果, '[[:cntrl:]]', '', 'g')) from  hf a  

此时使用regexp_replace()函数对其进正则替换,可以正则表达式,替换指定的控制符。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/681769.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于位操作符的实际应用<C语言>

前言 位操作符在C语言初学阶段相对其他操作符来说,是一种难度比较大的操作符,且运用较少的一类操作符,但是位操作符并不是“一无是处”,合理运用的位操作符,在某些场景下可以优化算法,提高代码的执行效率&a…

GRS认证的优点和缺点是什么?

GRS认证(Global Recycled Standard)的优点主要体现在以下几个方面: 环保性:GRS认证鼓励和保证产品中使用更多的回收材料,从而减少对原始资源的需求和开采,有助于降低环境负荷,促进资源的循环利用…

Python入门到精通,一个月就够了!前字节大佬超详细系统学习路线

毫无疑问,Python 是当下最火的编程语言之一。 对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事。 感觉很迷茫?学了一段时间还是不入流?很大一部分原因是因为你没有一个完整的知识体系&…

python日常消费数据占比分析总结年消费方向

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 整体消费情况 消费趋势 特定领域消费数据

大数据面试题 —— 数据仓库

目录 数据仓库是什么数据仓库和数据库的区别为什么要对数据仓库分层数仓分层,以及每一层的作用维度建模的三种模型范式建模、维度建模维度建模过程,如何确定这些维度 ***维度模型的各个维度之间是怎么聚合的聚合过程的数据倾斜怎么解决?数据质…

pyqt6的安装,使用-1

pyqt6安装的话,在自己所用的环境里安就可以,之前写有yolov5,yolov8的环境配置,python3.8的我安装就没有问题,打开anaconda,激活自己的环境 把这复制进去 pip install pyqt6 pip install pyqt6-tools 这个安装完了之后…

基于stm32的spi从机实验HAL库编程

目录 基于stm32的spi从机实验HAL库编程前言业务场景硬件设计接线配置swd接口配置spi配置DMA配置中断配置系统时钟配置工程生成代码写点从机代码上机现象后记本文使用的测试工程 基于stm32的spi从机实验HAL库编程 前言 在微控制器的世界中,串行外设接口(SPI)是一种…

数智化快速开发平台

助力企业IT规划标准化,实现企业IT生态化 目前市场上有很多面向企业各种业务场景的产品,这些产品给企业管理带来便利性的同时,也带来了一系列问题,例如: 不同系统的后台管理功能基本一致,却需要重复建设&a…

基于Detectron2的计算机视觉实践

书籍:Hands-On Computer Vision with Detectron2: Develop object detection and segmentation models with a code and visualization approach 作者:Van Vung Pham,Tommy Dang 出版:Packt Publishing 书籍下载-《基于Detectr…

Codigger:Web应用让开发者拥有更高效的开发之旅

在当今软件开发领域,Web应用以其跨平台、易访问和实时更新的特性,逐渐成为了主流的开发方向。从开发者的视角来看,Codigger借助B/S(浏览器/服务器)架构和云计算技术,为开发者带来了诸多便利和优势。这些优势…

Java Web 学习笔记(一) —— MySQL(3)

目录 1 Mysql 函数1.1 日期函数1.2 判断函数1.3 字符函数1.4 数学函数 2 Mysql 性能2.1 提高操作数据库性能2.2 执行次数比较多的语句2.3 sql语句的执行效率 3 Mysql 优化(***)3.1 定位慢查询3.2 SQL执行计划3.3 索引3.3.1 索引介绍与分类3.3.2 索引的使…

#内部类#

1,概念 如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外 部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。重点:内部类是一个独立的类 注意&…