oracle varchar2(n) 与 postgresql varchar(n) 的区别

os: centos 7.4
db: postgresql 11.5
db: oracle 11.2.0.4

oracle varchar2(n) 表示 n 个字节

postgresql varchar(n) 表示 n 个字符

版本

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
# 
# su - postgres
Last login: Sat Oct 26 22:55:25 CST 2019 on pts/0
$
$ psql -c "select version();"
                                                 version                                                 
---------------------------------------------------------------------------------------------------------
 PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
(1 row)

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
# 
# su - oracle
Last login: Tue Jan 21 03:40:05 CST 2020 on pts/0
$ sqlplus / as sysdba;

SQL*Plus: Release 11.2.0.4.0 Production on Mon Feb 3 10:29:09 2020

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> set lines 300;
SQL> set pages 300;
SQL> 
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE	11.2.0.4.0	Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> 

oracle varchar2(n)

SQL> set lines 300;
set pages 300;

SQL> create table tmp_t0(name varchar2(2));

Table created.

SQL> insert into tmp_t0(name) values('a'); 

1 row created.

SQL> insert into tmp_t0(name) values('aa');

1 row created.

SQL> insert into tmp_t0(name) values('aaa');
insert into tmp_t0(name) values('aaa')
                                 *
ERROR at line 1:
ORA-12899: value too large for column "SCOTT2"."TMP_T0"."NAME" (actual: 3,maximum: 2)

SQL> insert into tmp_t2(name) values('我');
insert into tmp_t2(name) values('我')
                                 *
ERROR at line 1:
ORA-12899: value too large for column "SCOTT2"."TMP_T0"."NAME" (actual: 3,maximum: 2)

SQL> select name,length(name),lengthb(name) from tmp_t0;

NA LENGTH(NAME) LENGTHB(NAME)
-- ------------ -------------
 a	      2 	    2
aa	      2 	    2

postgresql varchar(n)

postgres=# create table tmp_t0(name varchar(2));
CREATE TABLE
postgres=# 
postgres=# insert into tmp_t0(name) values('a');
INSERT 0 1
postgres=# insert into tmp_t0(name) values('aa');
INSERT 0 1

postgres=# insert into tmp_t0(name) values('aaa');
ERROR:  value too long for type character varying(2)
postgres=# 
postgres=# insert into tmp_t0(name) values('我');
INSERT 0 1
postgres=# insert into tmp_t0(name) values('我我');
INSERT 0 1
postgres=# insert into tmp_t0(name) values('我我我');
ERROR:  value too long for type character varying(2)
postgres=# 

postgres=# select name,char_length(name),octet_length(name),bit_length(name) from tmp_t0;
 name | char_length | octet_length | bit_length 
------+-------------+--------------+------------
 a    |           1 |            1 |          8
 aa   |           2 |            2 |         16
 我   |           1 |            3 |         24
 我我 |           2 |            6 |         48
(4 rows)

char_length 字符长度
octet_length 字节长度
bit_length bit长度(一个字节8个bit)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值