oracle字符单位的类型,Oracle vs PostgreSQL,研发注意事项(5)- 字符类型

本节介绍了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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值