首页 > 数据库 >PG数据库存储验证

PG数据库存储验证

时间:2024-01-03 14:06:03浏览次数:26  
标签:00 27 赵赵 数据库 存储 0F PG zhaobsh 31

PG数据库存储验证


背景

最近学习了SQLServer数据库的varchar和nvarchar的存储
想到PG数据库其实没让选择字符集,也没有nvarchar
所以想学习一下nvarchar的使用情况

建表以及插入sql

su - postgres
psql
create database zhaobsh
\c zhaobsh
create table zhaobsh(zhaobsh varchar(30));
插入数据
insert into zhaobsh values ('123abc');
insert into zhaobsh values ('abcd赵1234');
insert into zhaobsh values ('abcde한국12345');

查看文件对应
select oid from pg_class where relname='zhaobsh'

下载文件到本地

下载winhex以及使用

https://www.lanzoux.com/iQBXbfxq8na

找了一个非官方的地址

下载直接打开文件就可以:

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00001FA0      61 62 63 64 65 ED 95  9C EA B5 AD 31 32 33 34    abcde頃滉淡1234
00001FB0   35 00 00 00 00 00 00 00  6E 31 00 00 00 00 00 00   5       n1      
00001FC0   00 00 00 00 00 00 00 00  02 00 01 00 02 08 18 00                   
00001FD0   19 61 62 63 64 E8 B5 B5  31 32 33 34 00 00 00 00    abcd璧?234    
00001FE0   6D 31 00 00 00 00 00 00  00 00 00 00 00 00 00 00   m1              
00001FF0   01 00 01 00 02 08 18 00  0F 31 32 33 61 62 63 00            123abc 

发现PG数据库跟SQLServer不一样他是逆序存放的. 
第一个: 
 123abc 都是单字节使用

第二个: 
然后是 abcd加上一个中文字符. 1234 
E8 B5 B5 
网上可以查到:
赵	Unicode (UTF-8)	utf-8	E8B5B5
符合预期,但是使用了 3个字节的存储大小. 

第三个:
ED 95  9C EA B5 AD
한국	Unicode (UTF-8)	utf-8	ED959CEAB5AD

发现韩文其实也是 三个字节的存储 在UTF-8的里面

注意我这个选择的是:
https://www.haomeili.net/Code/DetailCodes
网站还是非常好的.

字段长度验证

zhaobsh=#  insert into zhaobsh values ('赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵');
INSERT 0 1
zhaobsh=# insert into zhaobsh values ('赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵');
ERROR:  value too long for type character varying(30)
zhaobsh=#

说明PG 其实是存储的是字符长度而不是字节长度

金额类型的验证

create table zhaobsh2 (zhaobsh2 decimal(19,3));
insert into zhaobsh2 values (1.1) ;
继续分析
发现原始的文件里面存放的全是 0 不知道decimal 到了哪个地方了. 

第二次测试:
create table zhaobsh3 (zhaobsh31 varchar(10),zhaobsh32 decimal(19,3));
insert into zhaobsh3 values ('12345',9.999);

分析应该是:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00001FF0      31 32 33 34 35 0F 80  81 09 00 06 27 00 00 00    12345 €    '   

怀疑是这几位数字表示了9.999
0F 80  81 09 00 06 27 00 00
为了继续验证. 
我将金额填充满. 
注意可以是 16位金额数. 
insert into zhaobsh3 values ('1234567',9999999999999999.999);

显示为:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00001F60      31 32 33 34 35 36 37  1B 83 81 0F 27 0F 27 0F    1234567 ? ' ' 
00001F70   27 0F 27 06 27 00 00 00  76 31 00 00 00 00 00 00   ' ' '   v1      
00001F80   00 00 00 00 00 00 00 00  03 00 02 00 02 08 18 00                   
00001F90   0F 

感觉后面很多位数都在进行金额的展示, 但是具体不太好判断. 

理论上 decimail 使用四个字节表示 9个数字. 19,3的精度应该至少需要9个字节. 
所以理论上应该是从 37 之后数 9个字节:
所以怀疑如下数字表示了 插入的数字

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00001F60                            1B 83 81 0F 27 0F 27 0F            ? ' ' 
00001F70   27 0F 27 06 27 00 00 00  76 31                     ' ' '   v1

但是没太有具体的证据 , 今天已经很晚了, 想先休息改天继续研究.



标签:00,27,赵赵,数据库,存储,0F,PG,zhaobsh,31
From: https://blog.51cto.com/u_11529070/9084322

相关文章

  • riak_cs elrang 的s3 存储服务
    riak_cs是riak团队开发的s3兼容存储,基于了riakkv,目前似乎缺少维护了(毕竟已经有不少开源而且更加强大的s3实现了)riak_cs基于erlang开发,对于学习下设计还是比较有帮助的,同时也能学习下erlang项目开发说明当然riak做为一个分布式的no-sql数据库还是最出名的,其他组件似乎使用的人......
  • mysql8.0存储过程
    1、存储过程概述1.1、理解含义:存储过程的英文是StoredProcedure。它的思想很简单,就是一组经过预先编译的SQL语句的封装。执行过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL......
  • m基于FPGA的PPM光学脉位调制解调系统verilog实现,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:2.算法涉及理论知识概要基于FPGA的PPM(脉冲位置调制)光学脉位调制解调系统是一个复杂的电子与光电子相结合的通信系统。2.1PPM调制解调原理脉冲相位调制(PPM)最早由Pierce提出并应用于空间通信,是利用脉冲的相对位置来传递信息的一种调制......
  • OC文件存储-补充
    NSKeyedArchiver-对象归档对象归档是指将对象写入文件保存在硬盘上,再次打开程序可以还原对象。(序列化、持久化)归档形式对foundation库中的对象进行归档单一对象归档NSArray*arr=@[@1,@"sda"];NSString*homePath=NSHomeDirectory();NSString*path=[homePathstringByAp......
  • openGauss学习笔记-183 openGauss 数据库运维-升级-升级操作
    openGauss学习笔记-183openGauss数据库运维-升级-升级操作介绍就地升级、灰度升级和滚动升级的详细操作。183.1就地升级和灰度升级操作步骤以root身份登录节点。创建新包目录。mkdir-p/opt/software/gaussdb_upgrade将需要更新的新包上传至目录“/opt/software/g......
  • openGauss学习笔记-184 openGauss 数据库运维-升级-升级验证
    openGauss学习笔记-184openGauss数据库运维-升级-升级验证本章介绍升级完成后的验证操作。给出验证的用例和详细操作步骤。184.1验证项目的检查表表1验证项目的检查表序号验证项目检查标准检查结果1版本查询查询升级后版本是否正确-2健康检查使用gs_ch......
  • 数据库攻防学习之Redis
    Redis0x01redis学习在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识,那么什么是redis?redis就是个数据库,常见端口为6379,常见漏洞为未授权访问。0x02环境搭建这里可以自己搭建一个redis环境,也可以用vulfocus搭建一个环境,可以两个都搭建,因为一些攻击手法,需要自己搭......
  • 如何在 Ubuntu 20.04 上以独立模式设置 MinIO 对象存储服务器
    前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。如何在Ubuntu20.04上以独立模式设置MinIO对象存储服务器介绍存储非结构化对象数据blob并使其可通过HTTPAPI(称为对象存储)进行访问的能力是现代技术领域不可或......
  • uniapp中用户登录数据的存储方法探究
    Hello大家好!我是咕噜铁蛋!作为一个博主,我们经常需要在应用程序中实现用户登录功能,并且需要将用户的登录数据进行存储,以便在多次使用应用程序时能够方便地获取用户信息。铁蛋通过科技手段帮大家收集整理了些知识,今天讲和大家探究在uniapp中如何存储用户登录的所有数据。用户登录数......
  • 从零开始学 Oracle 数据库 (001)
    学习目的从零开始学习Oracle数据库,达到OCP实操水平。学习计划目标用100天学习Oracle数据库,为记录学习过程,计划连更100天学习笔记。学习纲要这块先空着,佛系学习法,学到哪算哪,回头再总结。学习环境数据库版本OracleDatabase19cRelease(19.3.0.0.0-64-bit,1......