本节介绍了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字符集
TEST-orcl@server4>create table tbl1(var varchar2(2),fixed char(2));
Table created.
TEST-orcl@server4>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)
TEST-orcl@server4>insert into tbl1 values('1','1');
1 row created.
TEST-orcl@server4>select lpad(var,2,'*'),lengthb(var),lpad(fixed,2,'*'),lengthb(fixed) from tbl1;
LPAD LENGTHB(VAR) LPAD LENGTHB(FIXED)
---- ------------ ---- --------------
*1 1 1 2
TEST-orcl@server4>create table tbl2(var varchar2(2 char),fixed char(2 char));
Table created.
TEST-orcl@server4>
TEST-orcl@server4>insert into tbl2 values('测试','测试');
1 row created.
TEST-orcl@server4>insert into tbl2 values('1','1');
1 row created.
TEST-orcl@server4>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
TEST-orcl@server4>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
TEST-orcl@server4>
编辑推荐:
- Oracle vs PostgreSQL,研发注意事项(5)- 字符类型03-14
- PostgreSQL 源码解读(32)- 查询语句#17(查询优化-表达式预处理#2)03-14
- PostgreSQL 源码解读(31)- 查询语句#16(查询优化-表达式预处理#1)03-14
- PostgreSQL 源码解读(33)- 查询语句#18(查询优化-表达式预处理#3)03-14
- PostgreSQL 源码解读(34)- 查询语句#19(查询优化-表达式预处理#4)03-14
- PostgreSQL 源码解读(35)- 查询语句#20(查询优化-简化Having和Grou...03-14
- PostgreSQL 源码解读(36)- 查询语句#21(查询优化-消除外连接)03-14
- PostgreSQL Page页结构解析(6)- B-Tree索引存储结构#203-14
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
