#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: heapantdb=# 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 ...。