今天有朋友问到在 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.1 创建测试表
1 |
create table test_bytes1(id int4,name character varying); |
1.2 查看 name 字段所占字节数
1 |
francs=> select id,name,octet_length(name),pg_column_size(name) from test_bytes1; |
备注:发现 pg_column_size 计算的数值比 octet_length 要多 1 个字节,这是在 strings 比较小的情况下,如果字符比较大,情况又不一样,pg_column_size 用来计算列物理所占字符数。
1.3 测试较大字符
1 |
francs=> insert into test_bytes1 values (4,repeat('aaa',100)); |
备注:从上看出,当存储较大字节时,pg_column_size 算出的字节数要比 octet_length 算出的字节数多 4。
1.4 测试更大字符
1 |
francs=> insert into test_bytes1 values (5,repeat('aaa',10000)); |
备注:这时 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
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/237941.html