Oracle vs PostgreSQL,研发注意事项(5)- 字符类型
程序员文章站
2022-06-11 21:49:04
...
本节介绍了Oracle和PG在字符类型上面的部分不同点,具体包括数据存储方式、实际占用的空间大小以及查询返回数据的处理方式等。
一、不同点
数据存储
Oracle
常规定义的长度,单位为Byte,如使用(N char)定义则为字符
如:
-- 以字节为单位,实际存储长度为字节数
create table t1(c1 varchar2(2));
-- 以字符为单位,实际存储长度与字符&字符集有关
-- 如GBK字符集,汉字字符2个字节,ASCII码1个字节,大小需根据实际的存储数据而定
create table t2(c1 varchar2(2 char)); -- 以字符为单位
PG
定义的长度,单位为字符
实际存储长度与字符&字符集有关,如UTF8字符集,汉字3个字节,ASCII吗1个字节,大小需根据实际的存储数据而定
查询返回数据
CHAR类型
Oracle返回实际存储的数据,包括数据库自动补足的空格;PG返回的数据会去掉后面的空格,不管是数据库自动补足的还是数据本身存在的空格.
空串
Oracle把空串视为NULL值,PG则不会.
二、测试数据
PG
UTF8字符集
testdb=# create table tbl1(var varchar(2),fixed char(2));
CREATE TABLE
testdb=# insert into tbl1 values('测试','测试');
INSERT 0 1
testdb=# insert into tbl1 values('测1','测1');
INSERT 0 1
testdb=# insert into tbl1 values('测','测');
INSERT 0 1
testdb=# select lpad(var,2,'*'),octet_length(var),lpad(fixed,2,'*'),octet_length(fixed) from tbl1;
lpad | octet_length | lpad | octet_length
------+--------------+------+--------------
测试 | 6 | 测试 | 6
测1 | 4 | 测1 | 4
*测 | 3 | *测 | 4
(3 rows)
testdb=# create table tbl2(var varchar(4),fixed char(4));
CREATE TABLE
testdb=# insert into tbl2 values('测试','测试 ');
INSERT 0 1
testdb=# select lpad(fixed,4,'*'),octet_length(fixed) from tbl2;
lpad | octet_length
--------+--------------
**测试 | 8
(1 row)
Oracle
GBK字符集
[email protected]>create table tbl1(var varchar2(2),fixed char(2));
Table created.
[email protected]>insert into tbl1 values('测试','测试');
insert into tbl1 values('测试','测试')
*
ERROR at line 1:
ORA-12899: value too large for column "TEST"."TBL1"."VAR" (actual: 4, maximum:
2)
[email protected]>insert into tbl1 values('1','1');
1 row created.
[email protected]>select lpad(var,2,'*'),lengthb(var),lpad(fixed,2,'*'),lengthb(fixed) from tbl1;
LPAD LENGTHB(VAR) LPAD LENGTHB(FIXED)
---- ------------ ---- --------------
*1 1 1 2
[email protected]>create table tbl2(var varchar2(2 char),fixed char(2 char));
Table created.
[email protected]>
[email protected]>insert into tbl2 values('测试','测试');
1 row created.
[email protected]>insert into tbl2 values('1','1');
1 row created.
[email protected]>select lpad(var,2,'*'),lengthb(var),lpad(fixed,2,'*'),lengthb(fixed) from tbl2;
LPAD LENGTHB(VAR) LPAD LENGTHB(FIXED)
---- ------------ ---- --------------
测 4 测 4
*1 1 1 2
[email protected]>select lpad(var,4,'*'),lengthb(var),lpad(fixed,4,'*'),lengthb(fixed) from tbl2;
LPAD(VAR LENGTHB(VAR) LPAD(FIX LENGTHB(FIXED)
-------- ------------ -------- --------------
测试 4 测试 4
***1 1 **1 2
[email protected]>
上一篇: 大爷你有才!
下一篇: 闲着也是闲着,得为主人家做点事