postgres数据库字符集讲解

文章详细比较了Oracle和Postgres数据库在UTF-8和GBK字符集下的中文字符存储差异,指出UTF-8下英文字符和汉字占用字节数,以及char和varchar类型对汉字存储的不同处理。
摘要由CSDN通过智能技术生成

#oracle和postgres数据库UTF-8字符集对比:

字符集比较:

相同特征:

在一个UTF-8字符集的oracle数据库中一个汉字占用1个字符,对应占用3个字节;而英文字符占用1个字节。

在一个UTF-8字符集的postgres数据库中一个汉字占用1个字符,同样对应占用3个字节;而英文字符占用1个字节。

不同特征:

但是在oracle数据库中,如果是一个char(10)的字段类型,最对可以存储3个汉字;而在postgres数据库中最多可以存放10汉字。

#oracle和postgres数据库GBK字符集对比:

字符集比较:

相同特征:

在一个GBK18030字符集的oracle数据库中一个汉字占用1个字符,对应占用2个字节;而英文字符占用1个字节。

在一个GBK18030字符集的postgres数据库中一个汉字占用1个字符,同样对应占用2个字节;而英文字符占用1个字节。

不同特征:

但是在oracle数据库中,如果是一个char(10)的字段类型,最对可以存储5个汉字;而在postgres数据库中最多可以存放10汉字。

#演示一下postgres字符集:

案例

字段类型varchar:

数据库字符集:

antdb=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)

表信息:

antdb=# \d+ test 
                                           Table "public.test"
 Column |         Type          | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+---------+----------+--------------+-------------
 id     | character varying(10) |           |          |         | extended |              | 
 name   | character varying(10) |           |          |         | extended |              | 
Access method: heap
 

antdb=# select * from test;                                  
 id |       name       
----+------------------
 1  | 我
 2  | 我是
 3  | 我是露
 4  | 我是露西
 5  | 我是露西的
 6  | 我是露西的好
 7  | 我是露西的好朋
 8  | 我是露西的好朋友
(8 rows)

antdb=# select LENGTH(id),LENGTH(name) from test;            
 length | length 
--------+--------
      1 |      1
      1 |      2
      1 |      3
      1 |      4
      1 |      5
      1 |      6
      1 |      7
      1 |      8
(8 rows)

antdb=# select OCTET_LENGTH(id),OCTET_LENGTH(name) from test;
 octet_length | octet_length 
--------------+--------------
            1 |            3
            1 |            6
            1 |            9
            1 |           12
            1 |           15
            1 |           18
            1 |           21
            1 |           24
(8 rows)

总结:

varchar类型:我们看到数据库里一个汉字的长度是占用1位,而一个汉字占用的字节长度是3。

字段类型char

数据库字符集:

antdb=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)

表信息:
antdb=# \d+ test
                                       Table "public.test"
 Column |     Type      | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+---------------+-----------+----------+---------+----------+--------------+-------------
 id     | character(10) |           |          |         | extended |              | 
 name   | character(10) |           |          |         | extended |              | 
Access method: heap

antdb=# select LENGTH(id),LENGTH(name) from test;  
 length | length 
--------+--------
      1 |      1
      1 |      2
      1 |      3
      1 |      4
      1 |      5
      1 |      6
      1 |      7
      1 |      8
(8 rows)

antdb=# select OCTET_LENGTH(id),OCTET_LENGTH(name) from test;
 octet_length | octet_length 
--------------+--------------
           10 |           12
           10 |           14
           10 |           16
           10 |           18
           10 |           20
           10 |           22
           10 |           24
           10 |           26
(8 rows)

总结:

char类型:我们看到数据库里一个汉字的长度是占用1位,而一个汉字占用的字节长度是3,但是由于是charl类型,会自动补全字节占位,所以就是12 14 ...。

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值