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)

你可能感兴趣的:(#,postgresql,opti,table,index,#,oracle,table,index)