字符类数据类型和oracle字符类型的区别

为兼容Oracle的数据类型,KingbaseES扩展了Oracle的NUMBERVARCHAR2CHAR(n)DATE类型。该措施使得移植Oracle的Create Table等DDL语句时,无需任何修改就能直接在KingbaseES环境中运行。

虽然扩展了oracle的字符类型,但是相同数据类型之间还是有有些区别:

数据类型 KingbaseES Oracle 
CHARACTER(n)
CHAR(n)
NCHAR(n)
char表示一个字符
Byte表示一个字节
默认为1
值域:10485760 char | byte。

值域:11g 默认值 1
CHAR=2000 byte|char
NCHAR=2000 byte
12c最大支持到32k(32767)

CHARACTER VARYING(n) NVARCHAR(n)
NVARCHAR2(n)
VARCHAR(n)
VARCHAR2(n)
值域:10485760 char | byte。
默认长度:可以不指定,默认没有限制。

值域:11g
VARCHAR2=4000 char|byte
NVARCHAR2=4000 byte
默认长度:VARCHAR2必须指定长度
12c最大支持到32k(32767)

 

下面通过一些例子来验证一下:

1、数据类型的最大长度

Oracle11g

char类型的最大长度是2000字节,varchar2是4000个字节。nchar,nvarchar2类型的最大长度根据数据集不同而不同。最终的byte数不能超过2000和4000。如字符集为AL16UTF16,则nchar的为2000/2=1000,而nvarchar2则为4000/2=2000

SQL> create table o_test1(name char(2001));

create table o_test1(name char(2001))
                               *
ERROR at line 1:

ORA-00910: specified length too long for its datatype

SQL> create table o_test1(name char(2000));

Table created.

SQL> create table o_test2(name varchar2(4001));

create table o_test2(name varchar2(4001))
                                   *
ERROR at line 1:

ORA-00910: specified length too long for its datatype

SQL> create table o_test2(name varchar2(4000));

Table created.

SQL> create table o_table3(name nchar(1001));

create table o_table3(name nchar(1001))
                                      *
ERROR at line 1:

ORA-00910: specified length too long for its datatype

SQL> create table o_table3(name nchar(1000));

Table created.

SQL> create table o_table4(name nvarchar2(2001));

create table o_table4(name nvarchar2(2001))
                                          *
ERROR at line 1:

ORA-00910: specified length too long for its datatype

SQL> create table o_table4(name nvarchar2(2000));

Table created.

  

KingbaseES

理论最大值10485760

test=# create table k_test1(name char(10485761));
错误:  类型 char 的长度不能超过 10485760
第1行create table k_test1(name char(10485761));
                               ^
test=# create table k_test1(name char(10485760));
CREATE TABLE

test=# create table k_test2(name varchar(10485761));
错误:  类型 varchar 的长度不能超过 10485760
第1行create table k_test2(name varchar(10485761));
                               ^
test=# create table k_test2(name varchar(10485760));
CREATE TABLE

test=# create table k_test3(name varchar2(10485761));
错误:  类型 varchar 的长度不能超过 10485760
第1行create table k_test3(name varchar2(10485761));
                               ^
test=# create table k_test3(name varchar2(10485760));
CREATE TABLE

 

2、char 默认长度

Oraclechar类型,不带字符数的时候,是1个字符(char(1)),而varchar2必须有字符数。nchar和nvarchar2分别与char,varchar2类似。

SQL> create table o_test1(name char, addr varchar);
create table o_test1(name char, addr varchar)
                                            *
ERROR at line 1:
ORA-00906: missing left parenthesis

SQL> create table o_test1(name char, addr varchar(5));
Table created.

SQL> insert into o_test1 values('12','OK');
insert into o_test1 values('12','OK')
                           *
ERROR at line 1:
ORA-12899: value too large for column "SYS"."O_TEST1"."NAME" (actual: 2, maximum: 1)

SQL> insert into o_test1 values('1','OK');
1 row created.

  

KingbaseES:

char类型,不带字符数的时候,也是默认一个字符(char(1)),而varchar不带字符数的时候,没有限制。

 

test=# create table k_test4(name char, addr varchar);
CREATE TABLE

test=# insert into k_test4 values('12', '1234567890');
错误:  对于字符类型来说这个值太长了(1)

test=# insert into k_test4 values('1', '1234567890');
INSERT 0 1

3、插入数据库的时候的,字符数超出最大长度部分的处理。

Oracle报错。

SQL> insert into o_test1 values('1','123456');
insert into o_test1 values('1','123456')

ERROR at line 1:
ORA-12899: value too large for column "SYS"."O_TEST1"."ADDR" (actual: 6,maximum: 5)


SQL> insert into o_test1 values('1','1234  ');
insert into o_test1 values('1','1234  ')

ERROR at line 1:
ORA-12899: value too large for column "SYS"."O_TEST1"."ADDR" (actual: 6,maximum: 5)
 

  

KingbaseES:当超出部分是有效的字符的时候,报错。但是,当使用明确的类型转换为最大字符数的时候,截断为最大长度,不报错。

 

test=# create table k_test5(name char(2), addr varchar(5));
CREATE TABLE

test=# insert into k_test5 values('123', '12345');
错误:  对于字符类型来说这个值太长了(2)

test=# insert into k_test5 values('12  ', '12345');
错误:  对于字符类型来说这个值太长了(2)

test=# insert into k_test5 values(102::char(2) , '12345');
INSERT 0 1

test=# select * from k_test5;
 name | addr 
------+-------
 10   | 12345

(1 行记录)

  

参考文档:

[应用开发及迁移]Oracle至KingbaseESV8迁移最佳实践

 

上一篇:MySQL数据库之——高级SQL语句(二)VIEW视图、联集和常见计算


下一篇:MySQL数据库基础