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

PG数据库存储验证

时间:2023-12-24 23:11:07浏览次数:39  
标签: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://www.cnblogs.com/jinanxiaolaohu/p/17925036.html

相关文章

  • 数据库使用
     这里是本地获取数据库  找到数据库名字 以及用户密码啥的   获得指定表的id属性  通过id进行查找表中 该id的信息  利用id修改指定数据  通过id删除表 添加 对照表的信息 进行添加因为id是自增所以不需要加......
  • 软件架构设计与模式之:数据库设计与数据访问模式
    1.背景介绍数据库设计和数据访问模式是软件架构和设计的核心领域之一。在现代软件系统中,数据库通常是系统的核心组件,负责存储和管理数据。数据访问模式则是一种设计模式,用于实现数据库操作的高效、可靠和可扩展的方式。在本文中,我们将讨论以下主题:背景介绍核心概念与联系核心算法原......
  • 后端架构师必知必会系列:分布式数据库与数据分片
    作者:禅与计算机程序设计艺术1.背景介绍随着互联网应用的普及和发展,数据库系统的需求和复杂度也在不断增加。传统的集中式数据库已经无法满足这些需求,因此分布式数据库应运而生。分布式数据库可以有效地应对高并发、大数据等场景,但是也带来了新的问题和挑战。其中,分布式数据库的一个......
  • MySQL核心技术原理之:MyISAM存储引擎
    作者:禅与计算机程序设计艺术1.背景介绍MyISAM是MySQL默认使用的存储引擎。它是一个高性能的静态表存储引擎,它保存了表结构信息及数据索引,适合于执行大量的静态SELECT操作。但是其不支持事物(transaction)、外键约束(foreignkeyconstraints)、FULLTEXT索引等特性。因此,对于需要使用这......
  • SQL入门让你的数据库升华为强大的搜索引擎
    作者:禅与计算机程序设计艺术1.背景介绍近年来,基于互联网、移动互联网、社交网络等新型信息传播技术的兴起,以及云计算技术的普及,使得数据量和数据类型不断增长,数据的存储成本越来越低廉,能够承载海量数据的服务器的出现。同时,基于数据分析的搜索引擎的兴起,也使得数据成为搜索的主要输......
  • 后端架构师必知必会系列:高可用数据库与数据一致性
    作者:禅与计算机程序设计艺术1.背景介绍什么是数据库?数据库(Database)是一个建立在计算机存储设备上的文件,用来存储、组织、管理和保护敏感的数据,其中的数据包括结构化数据和非结构化数据。数据库通过控制数据访问权限、提供数据备份功能、实现数据共享、确保数据完整性等功能,从而帮助......
  • 数据库(DDL)学习历程一
    数据定义语言(DDL)数据库操作【1】数据库的创建语法:createdatabase<数据库名>;样例:createdatabasestudy;【2】数据库的展示showdatabases;【3】数据库的删除语法:dropdatabase<数据库名>样例:dropdatabasestudy;【4】数据库的使用语法:use<数据库名>样例:usestu......
  • 11.PG表之pg_class和pg_stats
    1.pg_class表postgres=#\dpg_classTable"pg_catalog.pg_class"Column|Type|Collation|Nullable|Default---------------------+--------------+-----------+----------+---------oid......
  • 10.PG的统计信息
    1.PG的统计信息数据的统计信息反映的是数据的分布情况,PG执行SQL语句会经过解析的过程和查询优化过程。解析过程:解析器将sql语句分解成数据结构并传递给后续步骤查询优化过程:查询优化器发现执行sql语句的最佳方案,并生产执行计划。查询优化器sql决定sql语句如何执行依赖于......
  • 9.PG表的磁盘碎片清理
    1.磁盘碎片在PG中删除行时,这些行为只是被标记为'dead',并不是真正从物理存储上进行删除,因为空间也没有被释放回收。在PG中,除非进行自动的清理(vacuum)或者手工的清理,否则数据块所占用的物理空间是不会释放,在物理存储空间被回收之前,会导致存储空间中存在很多空洞。大量的更......