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>
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
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)