2024-11-20

SourceURL:file:///home/cheng/bb/artical/BB系列文章002_PostgreSQL深度探秘_整数.docx

BB系列文章002

PostgreSQL深度探秘:整数

SourceURL:file:///home/cheng/bb/artical/BB系列文章002_PostgreSQL深度探秘_整数.docx

注:本文中使用的导出PostgreSQL表数据的工具pgexp和查看导出结果的工具bb可以在https://gitee.com/cheng719/bb.git下载, 包含了在linux下运行的这些工具和说明文档,如果需要其它平台(例如AIX、HPUX、Solaris等)(未支持这些平台的原因手头没有编译环境),请联系作者abusoft@sina.com。

如果要实现捕获PostgreSQL数据库的变化数据(CDC)以便用来实现数据库的容灾、备份、复用等,需要掌握数据库各种数据类型在磁盘里面实际存储的内容。


[if !supportLists]1. [endif]PostgreSQL整数包含如下几种类型:


整数类型存储长度描述范围

smallint2小整数-32768~+32767

integer4整数-2147483648 to +2147483647

bigint8长整数-9223372036854775808 to +9223372036854775807

smallserial2小自增整数1 to 32767

serial4自增整数1 to 2147483647

bigserial8长自增整数1 to 9223372036854775807


[if !supportLists]2. [endif]建立测试表,并且插入数据:

create table test_int (

f_smallint smallint,

f_int integer,

f_big bigint,

f_smallserial smallserial,

f_serial serial,

f_bigserial bigserial );

insert into test_int values ( 100,101, 102, 103, 104,105 );

insert into test_int values ( 1000,1010, 1020, 1030, 1040,1050 );

insert into test_int values ( 10000,10100, 10200, 10300, 10400,10500 );


[if !supportLists]3. [endif]使用工具pgexp导出表的数据:

$ pgexp -o /tmp/11 -t public.test_int

1118221628[5] Export: bank.public.test_int

1118221628[5] OUT: writedSize=  143  rows=  3 dataSize=  143

Export: rows=3, Length=552

导出了3条记录,结果存放在文件 /tmp/11,文件长度552。


[if !supportLists]4. [endif]使用工具bb查看导出的表的数据:

$ bb -3 /tmp/11

create table bank.public.test_int (

    f_smallint   int2

 , f_int        int4

 , f_big        int8

 , f_smallserial smallserial not null

 , f_serial     serial not null

 , f_bigserial  bigserial not null

 );

insert into bank.public.test_int (f_smallint,f_int,f_big,f_smallserial,f_serial,f_bigserial) values (100,101,102,103,104,105),

(1000,1010,1020,1030,1040,1050),

(10000,10100,10200,10300,10400,10500);


[if !supportLists]5. [endif]使用工具bb查看导出的表的数据的内部表示方法:

$bb -2 /tmp/11

   R000 CC [    1]: 06

      c0_0 [    2]: 0064                                   .d                

      c0_1 [    4]: 0000 0065                              ...e              

      c0_2 [    8]: 0000 0000 0000 0066                    .......f          

      c0_3 [    2]: 0067                                   .g                

      c0_4 [    4]: 0000 0068                              ...h              

      c0_5 [    8]: 0000 0000 0000 0069                    .......i          

   R001 CC [    1]: 06

      c1_0 [    2]: 03e8                                   ..                

      c1_1 [    4]: 0000 03f2                              ....              

      c1_2 [    8]: 0000 0000 0000 03fc                    ........          

      c1_3 [    2]: 0406                                   ..                

      c1_4 [    4]: 0000 0410                              ....              

      c1_5 [    8]: 0000 0000 0000 041a                    ........          

   R002 CC [    1]: 06

      c2_0 [    2]: 2710                                   '.                

      c2_1 [    4]: 0000 2774                              ..'t              

      c2_2 [    8]: 0000 0000 0000 27d8                    ......'.          

      c2_3 [    2]: 283c                                   (<                

      c2_4 [    4]: 0000 28a0                              ..(.              

      c2_5 [    8]: 0000 0000 0000 2904                    ......).    


[if !supportLists]6. [endif]数据类型为 smallint、smallserial 的内部表示:

数值数据库文件内部存储

1000x0064

1030x0067

10000x03e8

10300x0406

100000x2710

103000x283c

即Postgresql存储smallint、smallserial的方法就是按照大头优先( big endian)存储2字节的小整数内存变量到数据库磁盘文件中。


[if !supportLists]7. [endif]数据类型为 integer、serial 的内部表示:

数值数据库文件内部存储

1010x00000065

1040x00000068

10100x000003f2

10400x00000410

101000x00002774

104000x000028a0

即Postgresql存储integer、serial的方法就是按照大头优先( big endian)存储4字节的整数内存变量到数据库磁盘文件中。


[if !supportLists]8. [endif]数据类型为 bigint、bigserial 的内部表示:

数值数据库文件内部存储

1020x0000000000000066

1050x0000000000000069

10200x00000000000003fc

10500x000000000000041a

102000x00000000000027d8

105000x0000000000002904

即Postgresql存储bigint、bigserial的方法就是按照大头优先( big endian)存储8字节的整数内存变量到数据库磁盘文件中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容