关于oracle varchar2 官方文档的描述

VARCHAR2 Data Type

The VARCHAR2 data type specifies a variable-length character string. When you create a VARCHAR2 column, you supply the maximum number of bytes or characters of data that it can hold. Oracle subsequently stores each value in the column exactly as you specify it, provided the value does not exceed the column's maximum length of the column. If you try to insert a value that exceeds the specified length, then Oracle returns an error.

You must specify a maximum length for a VARCHAR2 column. This maximum must be at least 1 byte, although the actual string stored is permitted to be a zero-length string (''). You can use the CHAR qualifier, for example VARCHAR2(10 CHAR), to give the maximum length in characters instead of bytes. A character is technically a code point of the database character set. You can use the BYTE qualifier, for example VARCHAR2(10 BYTE), to explicitly give the maximum length in bytes. If no explicit qualifier is included in a column or attribute definition when a database object with this column or attribute is created, then the length semantics are determined by the value of the NLS_LENGTH_SEMANTICS parameter of the session creating the object. Independently of the maximum length in characters, the length of VARCHAR2 data cannot exceed 4000 bytes. Oracle compares VARCHAR2 values using nonpadded comparison semantics.

测试环境:

SQL> select * from v$version t where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production SQL> select * from v$nls_parameters t where t.PARAMETER='NLS_LENGTH_SEMANTICS'; PARAMETER VALUE
---------------------------------------------------------------- ----------------
---------
NLS_LENGTH_SEMANTICS BYTE SQL>

创建测试表

create table test_varchar2_datatype(
char_1 varchar2(4000 byte),
char_2 varchar2(4000 char),
char_3 varchar2(4000),
char_21 varchar2(2000 byte),
char_22 varchar2(2000 char),
char_23 varchar2(2000)
);

测试过程username列都为汉字

SQL> select length(listagg(t.username) within group (order by t.userid)||'中国石化') from t_char_source t
2 where rownum <148; LENGTH(LISTAGG(T.USERNAME)WITHINGROUP(ORDERBYT.USERID)||'中国石化')
-------------------------------------------------------------------
2000 SQL> insert into test_varchar2_datatype(char_1,
2 char_2,
3 char_3,
4 char_21,
5 char_22,
6 char_23
7 )
8 select
9 listagg(t.username) within group (order by t.userid)||'中国石化',
10 listagg(t.username) within group (order by t.userid)||'中国石化',
11 listagg(t.username) within group (order by t.userid)||'中国石化',
12 listagg(t.username) within group (order by t.userid)||'中国石化',
13 listagg(t.username) within group (order by t.userid)||'中国石化',
14 listagg(t.username) within group (order by t.userid)||'中国石化'
15 from t_char_source t
16 where rownum <148;
listagg(t.username) within group (order by t.userid)||'中国石化',
*
第 12 行出现错误:
ORA-12899: 列 "HR"."TEST_VARCHAR2_DATATYPE"."CHAR_21" 的值太大 (实际值: 3991, 最大值: 2000) SQL> insert into test_varchar2_datatype(char_1,
2 char_2,
3 char_3,
4 char_22,
5 char_23
6 )
7 select
8 listagg(t.username) within group (order by t.userid)||'中国石化',
9 listagg(t.username) within group (order by t.userid)||'中国石化',
10 listagg(t.username) within group (order by t.userid)||'中国石化',
11 listagg(t.username) within group (order by t.userid)||'中国石化',
12 listagg(t.username) within group (order by t.userid)||'中国石化'
13 from t_char_source t
14 where rownum <148;
listagg(t.username) within group (order by t.userid)||'中国石化'
*
第 12 行出现错误:
ORA-12899: 列 "HR"."TEST_VARCHAR2_DATATYPE"."CHAR_23" 的值太大 (实际值: 3991, 最大值: 2000) SQL> insert into test_varchar2_datatype(char_1,
2 char_2,
3 char_3,
4 char_22
5 )
6 select
7 listagg(t.username) within group (order by t.userid)||'中国石化',
8 listagg(t.username) within group (order by t.userid)||'中国石化',
9 listagg(t.username) within group (order by t.userid)||'中国石化',
10 listagg(t.username) within group (order by t.userid)||'中国石化'
11 from t_char_source t
12 where rownum <148; 已创建 1 行。 SQL> commit; SQL> select length(listagg(t.username) within group (order by t.userid)||'中国石化') from t_char_source t
2 where rownum <150;
select length(listagg(t.username) within group (order by t.userid)||'中国石化') from t_char_source t
*
第 1 行出现错误:
ORA-01489: 字符串连接的结果过长 SQL>

结论:

1.varchar2的指定方式为:VARCHAR2(size [BYTE | CHAR]) ,如果没有指定byte或是char 由参数NLS_LENGTH_SEMANTICS确定计数的是byte还是char。

2.4000byte 是死结,无论指定的是byte 或 char 都无法超越4000byte,就是说占多个byte的字符比如汉字最多2000个,即便是在创建表的时候指定了4000 char,最后也只能装4000byte的量。Nvarchar2 同理。(LOB 字段 XMLagg 除外)

3.函数中如果超过4000个byte也会报ORA-01489错误。

4.函数wn_concat在官方文档没有介绍,在oracle 12c 中已经没有该函数了。oracle 11g and up 可以使用 listagg替代,listagg 在oracle 官方文档有描述。

Oracle varchar2 4000的更多相关文章

  1. String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)

    问题描述 需要向数据库中保存数据,但某个字段内容长度过长(有中文.符号.英文),应该根据字符串内容与数据库存储上限合理设置储存方式. 解决思路 分条存储,即多条数据前n个字段一致,最后内容字段不同,下 ...

  2. ORACLE VARCHAR2最大长度问题

    VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型.简单的说,要看你在 ...

  3. Oracle varchar2最大支持长度(转)

    oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...

  4. [20171218]varchar2(4000)如何保存.txt

    [20171218]varchar2(4000)如何保存.txt --//以前写的,不知道为什么被删除了,现在补上. 如果一行能被存储于一个数据块(data block)中,那么其行头(row hea ...

  5. Oracle varchar2或char类型的byte和char的区别

    那其中的BYTE和CHAR有什么区别呢 BYTE,用字节指定:VARCHAR2(10 BYTE).这能支持最多10字节的数据,在一个多字节字符集中,这可能只是两个字符.采用多字节字符集时,字节与字符并 ...

  6. Oracle Varchar2长度 及 PHP 长度判断

    oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型.          对应该类型,在oracle中有三种比较常用的类型:varchar2(byte).varchar2( ...

  7. oracle varchar2 和varchar 区别

    今天,往ORACLE一个表的VACHAR2(20)字段中插入七个汉字,提示错误:插入的值太大. 改成插入六个汉字,又可以. 一直以来,都以为一个汉字占两个字节.觉得非常奇怪. 用length().le ...

  8. mysql varchar vs oracle varchar2

    1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为 ...

  9. ORACLE varchar2类型的字段更改为clob

    将varchar2类型字段改成clob类型    --增加临时新字段 alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中updat ...

随机推荐

  1. Android 高级UI设计笔记13:Gallery(画廊控件)之 循环显示图像

    1. 循环显示图像的原理  循环显示有些类似于循环链表,最后一个结点的下一个结点又是第1个结点.循环显示图像也可以模拟这一点. 也许细心的读者从上一节实现的ImageAdapter类中会发现些什么.对 ...

  2. TFS 2010 使用手册(四)备份与恢复

    本文参考了http://developer.51cto.com/art/201010/229066.htm的文章. TFS的备份与恢复一直没有很完整的解决方案,要完成一个很好的备份要有很多的手动步骤才 ...

  3. Java线程同步的方式

     java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的 ...

  4. iphone开发之用lipo合并模拟器库和真机库,发布一个通用的静态库

    转载自:http://blog.csdn.net/arthurchenjs/article/details/6044616 lipo lipo –create Release-iphoneos/lib ...

  5. 如何鉴别程序抄袭c语言程序代写

    如何鉴别程序抄袭:如何鉴别一份程序代码是抄袭另一份程序.输入:两个C语言源程序文件 输出:抄袭了多少?给出最相似的片段,判断是谁抄袭了谁? 提示:首先进行统一规范化排版,去掉无谓的空格.空行,然后比对 ...

  6. [转]15 个顶级 HTML5 游戏引擎

    本文转自:http://www.open-open.com/news/view/13874db 1) HTML5 Game Engine Construct 2 is a leading high q ...

  7. hdu 4081 最小生成树+树形dp

    思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...

  8. POJ 3422 Kaka's Matrix Travels K取方格数

    题目:给出n*n的方格矩阵,现在从左上方走m次到右下方,问m次能够获得的最大价值和. 分析:最大费用流.拆点进行限制每个格子只取一次,假设点x拆成 x,xx,右边(假设有)y,yy,下方(假设有)z, ...

  9. Cocoa Touch的3种类的交流方式delegate/target/notification

    1. Delegate 在Cocoa Touch类对象运行的周期中,某一个时间点它会去调用一些指定类的指定函数来完成他自身所要完成的功能.这个”指定的类”,就称为这个类的委托类.”指定函数”则是一些在 ...

  10. PAT1014——福尔摩斯的约会

    大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”.大侦探很快就明白了,字条 ...