字符类数据类型和oracle字符类型的区别
为兼容Oracle的数据类型,KingbaseES扩展了Oracle的NUMBER、VARCHAR2、CHAR(n)和DATE类型。该措施使得移植Oracle的Create Table等DDL语句时,无需任何修改就能直接在KingbaseES环境中运行。
虽然扩展了oracle的字符类型,但是相同数据类型之间还是有有些区别:
数据类型 | KingbaseES | Oracle |
CHARACTER(n) CHAR(n) NCHAR(n) |
char表示一个字符 Byte表示一个字节 默认为1 值域:10485760 char | byte。 |
值域:11g 默认值 1 |
CHARACTER VARYING(n) NVARCHAR(n) NVARCHAR2(n) VARCHAR(n) VARCHAR2(n) |
值域:10485760 char | byte。 默认长度:可以不指定,默认没有限制。 |
值域:11g |
下面通过一些例子来验证一下:
1、数据类型的最大长度
Oracle11g:
char类型的最大长度是2000字节,varchar2是4000个字节。nchar,nvarchar2类型的最大长度根据数据集不同而不同。最终的byte数不能超过2000和4000。如字符集为AL16UTF16,则nchar的为2000/2=1000,而nvarchar2则为4000/2=2000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 默认长度
Oracle:char类型,不带字符数的时候,是1个字符(char(1)),而varchar2必须有字符数。nchar和nvarchar2分别与char,varchar2类似。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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不带字符数的时候,没有限制。
1 2 3 4 5 6 7 8 | 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:报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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:当超出部分是有效的字符的时候,报错。但是,当使用明确的类型转换为最大字符数的时候,截断为最大长度,不报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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迁移最佳实践
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)