为兼容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迁移最佳实践

字符类数据类型和oracle字符类型的区别的更多相关文章

  1. KingbaseES 时间类型数据和oracle时间类型的区别

    Oracle日期时间类型有两类,一类是日期时间类型,包括Date, Timestamp with time zone, Timestamp with local time zone.另一类是Inter ...

  2. oracle 插入数据之坑--------oracle字符类型varchar2一个中文占多少字节

    如果你误认为是两个字节,那就大错特错了 Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('langu ...

  3. 字符输入流Reader类和FileReader和字符输入流读取字符数据

    java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类 共性成员方法: int read();读取单个字符并返回 int read(char[] ...

  4. 数据类型和typeof操作符

    虽然学习js有一段时间了,但是对js的基础语法却是有些生疏.最近在看jquery源码,决定随带总结一些基础的语法知识.今天总结一下数据类型和typeof,这在写js的时候,是不得不知道的知识. 数据类 ...

  5. Core Java 总结(字符和字符串类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 字符,字符串类问题 正则表达式问题 J ...

  6. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  7. 字节流, FileOutputStream类,FileInputStream类,复制文件,字符流

    字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节 基本方法: 子类可继承调用以上方法 FileOutputStream类 构造方 ...

  8. mysql基础-数据类型和sql模式-学习之(三)

    0x01 mysql的两种方向: 开发DBA:数据库设计(E-R关系图).sql开发.内置函数.存储历程(存储过程和存储函数).触发器.时间调度器(event scheduler) 运维----> ...

  9. Java数据类型和MySql数据类型对应一览

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

随机推荐

  1. 你真的会python中的for循环吗

    for 循环是 Python 中的通用序列迭代器:它可以单步遍历任何有序序列中的元素.for 语句适用于字符串.列表.元组.其他内置可迭代对象和类创建的新对象. for 通常比 while 循环更容易 ...

  2. 【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()

    UI自动化中的重要工作就是元素定位了,高效精准的定位方法可以让工作事半功倍. 在过去的一段web自动化经历中,使用的selenium库支持了多种定位方法,我们可以利用这些定位方法来做进一步封装,写出符 ...

  3. 30m精度土壤类型、土壤质地、土壤有机质、土壤PH、土壤氮磷钾

    ​数据下载链接:数据下载链接 引言 全国土壤类型.质地.养分及变化等信息产品分为土壤类型数据.土壤质地数据.土壤养分数据及土壤变化数据等.该类产品是基于野外调查和实地采样,结合历史数据,建立全国土壤类 ...

  4. 深度学习基础-基于Numpy的感知机Perception构建和训练

    1. 感知机模型   感知机Perception是一个线性的分类器,其只适用于线性可分的数据.          f(x) = sign(w.x + b) 其试图在所有线性可分超平面构成的假设空间中找 ...

  5. 事务@Transactional注解的属性

    事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.事务的传播行为可以由传播属性指定.Sprin ...

  6. Object类和toString方法 --和Object类的equals方法

    一,Object类概述:Object是类层次结构的根,每个类都可以将Object作为超类,所有类都直接或者间接的继承自该类构造方法:pulic Object()在面向对象中,子类要访问父类的无参构造方 ...

  7. OpenWrt之feeds.conf.default详解

    目录 OpenWrt之feeds.conf.default详解 文件内容 命令解释 src-svn与src-gitsvn src-git与src-git-full src-cpy与src-link 其 ...

  8. InvalidClassException异常_原理和解决方案和练习_序列化集合

    InvalidClassException异常_原理和解决方案 当JVM反序列化对象的时候,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个Inv ...

  9. python 文件操作(读写等)

    简介 在实际开发中我们需要对文件做一些操作,例如读写文件.在文件中新添内容等,通常情况下,我们会使用open函数进行相关文件的操作,下面将介绍一下关于open读写的相关内容. open()方法 ope ...

  10. AlexNet—论文分析及复现

    AlexNet卷积神经网络是由Alex Krizhevsky等人在2012年的ImagNet图像识别大赛获得冠军的一个卷积神经网络,该网络放到现在相对简单,但也是深度学习不错的卷积神经网络.论文:&l ...