注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL: 如何计算 character 数据类型物理占用多少字节?  

2013-02-27 21:55:22|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


       今天有朋友问到在 PostgreSQL 中,character 字符类型物理占用字节数是如何计算的?
这方面关注得比较少,于是查下手册,发现有系统函数 octet_length 可以查询字符类型数据
所占的字节数。


--octet_length 函数
 Function Return Type Description Example Result
 octet_length(string) int Number of bytes in string octet_length('jose') 4
备注:接下来测试下。
  

一 测试
--1. 创建测试表
 francs=> create table test_bytes1(id int4,name character varying);
CREATE TABLE

francs=> insert into test_bytes1 values (1,'a'),(2,'ab'),(3,'abc');
INSERT 0 3

francs=> select * from test_bytes1;
 id | name 
----+------
  1 | a
  2 | ab
  3 | abc
(3 rows)
   

--1.2 查看 name 字段所占字节数
 francs=> select id,name,octet_length(name),pg_column_size(name) from test_bytes1;
 id | name | octet_length | pg_column_size 
----+------+--------------+----------------
  1 | a    |            1 |              2
  2 | ab   |            2 |              3
  3 | abc  |            3 |              4
(3 rows)
    备注:发现 pg_column_size 计算的数值比 octet_length 要多 1 个字节,这是在 strings 比较小的情况下,
              如果字符比较大,情况又不一样,pg_column_size 用来计算列物理所占字符数。
       

--1.3 测试较大字符       
 francs=> insert into test_bytes1 values (4,repeat('aaa',100));
INSERT 0 1

francs=> select id,octet_length(name),pg_column_size(name) from test_bytes1;
 id | octet_length | pg_column_size 
----+--------------+----------------
  1 |            1 |              2
  2 |            2 |              3
  3 |            3 |              4
  4 |          300 |            304
(4 rows)       
     备注:从上看出,当存储较大字节时,pg_column_size 算出的字节数要比 octet_length 算出的
               字节数多 4。
        
--1.4 测试更大字符
 francs=> insert into test_bytes1 values (5,repeat('aaa',10000));
INSERT 0 1

francs=> select id,octet_length(name),pg_column_size(name) from test_bytes1;
 id | octet_length | pg_column_size 
----+--------------+----------------
  1 |            1 |              2
  2 |            2 |              3
  3 |            3 |              4
  4 |          300 |            304
  5 |        30000 |            353
(5 rows)
    备注:这时 octet_length 计算的字节数反而超过 pg_column_size 了,这是由于大字段发生了 TOAST 
  

二 附:pg_column_size 函数
 Name Return Type Description
 pg_column_size(any) int Number of bytes used to store a particular value (possibly compressed)
备注:   pg_column_size 与 octet_length 的区别是,前者计算的是压缩后的值。

三 参考
http://www.postgresql.org/docs/9.2/static/datatype-character.html
http://www.postgresql.org/docs/9.2/static/functions-string.html
http://www.postgresql.org/docs/9.2/static/functions-admin.html
http://www.postgresql.org/docs/9.2/static/storage-toast.html

  评论这张
 
阅读(11928)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016