PG数据库存储验证
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
但是没太有具体的证据 , 今天已经很晚了, 想先休息改天继续研究.
PG数据库存储验证的更多相关文章
- 更改Mysql数据库存储位置的具体步骤
首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定 一.首先把mysql的服 ...
- edgedb 内部pg 数据存储的探索 (二) 创建数据库命令说明
前面已经创建好了一个简单可以访问pg 的edgedb 环境,现在测试几个数据库操作命令在pg 的存储 创建数据库 连接环境 注意账户是按照上次创建的环境配置 edgedb -u edgedb 创建数据 ...
- Ocelot简易教程(七)之配置文件数据库存储插件源码解析
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...
- Python3编写网络爬虫12-数据存储方式五-非关系型数据库存储
非关系型数据库存储 NoSQL 全称 Not Only SQL 意为非SQL 泛指非关系型数据库.基于键值对 不需要经过SQL层解析 数据之间没有耦合性 性能非常高. 非关系型数据库可细分如下: 键值 ...
- Python3编写网络爬虫11-数据存储方式四-关系型数据库存储
关系型数据库存储 关系型数据库是基于关系模型的数据库,而关系模型是通过二维表保存的,所以它的存储方式就是行列组成的表.每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系, ...
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- 更改Mysql数据库存储位置
默认安装位置 C:\Program Files\MySQL\MySQL Server 5.7 一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开MyS ...
- [转帖]分享一份珍藏多年的PG数据库部署架构图
分享一份珍藏多年的PG数据库部署架构图 记得同事曾经测试过citus https://www.toutiao.com/i6710613553277043213/ 原创 波波说运维 2019-07-11 ...
- 修改mysql中数据库存储主路径
一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开文件夹C:\ProgramData\MySQL\MySQL Server 5.7中的my.ini文件 ...
- 修改mysql数据库存储路径
最近一段比较忙,所以一直没有及时的更新总结一下测试路上遇到的问题,今天先来分享一下如何修改mysql存储路径(场景:在自己电脑上搭建的服务器上安装mysql,二.在公司自己的服务器上搭建mysql数据 ...
随机推荐
- 简单几行实现sliver上线提醒
准备魔改sliver去掉一些特征什么的,这里记录一下最简单实现上线消息通过企业微信机器人提醒的方式,这很简单也有很多不足还需要接着改的 protobuf中对消息Beacon和Session的定义如下, ...
- 前端 Git 使用约定
前端 Git 使用约定 背景 开发前端项目,有以下困惑: 使用哪个分支开发,哪个分支发布 修复线上bug的流程是什么,如何避免修复完了下次却又出现了 cms分支有十多个,是否都有用 如何快速找到之前某 ...
- MySQL面试题:一条SQL语句在MySQL中执行过程全解析
一 .MySQL 基础架构分析 介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图. 连接/线程处理(连接器): 身份认证和权限相关(如连接处理.授权认证.安全等等). 查询缓存: 执行查询语句的 ...
- 扩展中国剩余定理(Excrt)笔记
扩展中国剩余定理(excrt) 本来应该先学中国剩余定理的.但是有了扩展中国剩余定理,朴素的 CRT 就没用了. 扩展中国剩余定理用来求解如下形式的同余方程组: \[\begin{cases} x \ ...
- 深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包
1. 堆栈 在JavaScript中,内存堆是内存分配的地方,调用栈是代码执行的地方. 原始类型的保存方式:在变量中保存的是值本身,所以原始类型也被称之为值类型. 对象类型的保存方式:在变量中保存的是 ...
- 【程序员的福音】一款C#开源的GitHub加速神器
前言 作为一个程序员你是否会经常会遇到GitHub无法访问(如下无法访问图片),或者是访问和下载源码时十分缓慢就像乌龟爬行一般.之前有尝试过手动修改host文件来解决网站的访问问题,以及更换网络但还是 ...
- 华为云FusionInsight MRS:千余节点滚动升级业务无中断
摘要:滚动升级作为大集群数据底座的必备能力,能够完美解决了传统大数据平台操作繁琐.业务停机.升级成本高等问题,实现一个架构的持续演进,业务无中断. 华为开发者大会2021(Cloud)大会期间,由华为 ...
- 深度克隆从C#/C/Java漫谈到JavaScript真复制
如果只想看js,直接从JavaScript标题开始. 在C#里面,深度clone有System.ICloneable.创建现有实例相同的值创建类的新实例 克隆原理 值类型变量与引用类型变量 如果我们有 ...
- 克魔助手:方便查看iPhone应用实时日志和奔溃日志工具
克魔助手:方便查看iPhone应用实时日志和奔溃日志工具 查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具,该工具可以方便地查看iPhone设备上应用和系统运行 ...
- 将MyBatis Mapper xml 放到 jar 包外面
在不改程序的情况下,修改 sql 时,需要将 Mapper 中的 XML 文件 放到外面 mybatis: mapper-locations: classpath:mapper/*.xml #J ...