Oracle varchar2 4000
关于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的更多相关文章
- String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)
问题描述 需要向数据库中保存数据,但某个字段内容长度过长(有中文.符号.英文),应该根据字符串内容与数据库存储上限合理设置储存方式. 解决思路 分条存储,即多条数据前n个字段一致,最后内容字段不同,下 ...
- ORACLE VARCHAR2最大长度问题
VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型.简单的说,要看你在 ...
- Oracle varchar2最大支持长度(转)
oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...
- [20171218]varchar2(4000)如何保存.txt
[20171218]varchar2(4000)如何保存.txt --//以前写的,不知道为什么被删除了,现在补上. 如果一行能被存储于一个数据块(data block)中,那么其行头(row hea ...
- Oracle varchar2或char类型的byte和char的区别
那其中的BYTE和CHAR有什么区别呢 BYTE,用字节指定:VARCHAR2(10 BYTE).这能支持最多10字节的数据,在一个多字节字符集中,这可能只是两个字符.采用多字节字符集时,字节与字符并 ...
- Oracle Varchar2长度 及 PHP 长度判断
oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型. 对应该类型,在oracle中有三种比较常用的类型:varchar2(byte).varchar2( ...
- oracle varchar2 和varchar 区别
今天,往ORACLE一个表的VACHAR2(20)字段中插入七个汉字,提示错误:插入的值太大. 改成插入六个汉字,又可以. 一直以来,都以为一个汉字占两个字节.觉得非常奇怪. 用length().le ...
- mysql varchar vs oracle varchar2
1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为 ...
- ORACLE varchar2类型的字段更改为clob
将varchar2类型字段改成clob类型 --增加临时新字段 alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中updat ...
随机推荐
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- 监控服务器JVM内存运行
使用jdk的jconsole进行监控jmx 首先,设置监控对象的端口 配置 catalina.sh #vi /usr/tomcat/bin/catalina.sh 注: /usr/tomcat/b ...
- C++中模板函数或模板类中关键词class和typename
##区别 基本上来说,class和typename几乎没有区别.在可以使用class的地方都可以使用typename,在使用typename的地方也几乎可以使用class. 可以看出我加黑了两个子:几 ...
- Visual Studio 扩展包(.vsix)制作
前言:上篇介绍了 Visual Studio扩展工具添加与卸载,本编要介绍的是Visual Studio 扩展包(.vsix)的制作. 方法: ①.下载并安装Visual Studio 2010 SD ...
- 【Linux】Shell脚本编程(三)
流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真”: 退出条件:当CONDITIO ...
- 控制语句(if-else+循环+switch)汇编规则
[1]说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出) ZF:零标志 SF:符号标志(结果为负数) OF:溢出标志 (补码溢出, 有符号溢出) [2]有两类指令设置条件码而不改变任何其 ...
- javascript 特性
作用域: javascript的作用域称为静态作用域,在定义语法上就能确认了,而不是运行时. if (true) { var i = 'moersing' } console.log(i); //可以 ...
- Storm累计求和中使用各种分组Grouping
Shuffle Grouping: 随机分组, 随机派发stream里面的tuple, 保证bolt中的每个任务接收到的tuple数目相同.(它能实现较好的负载均衡) Fields Grouping: ...
- SQL的内连接与外连接
转自:http://blog.csdn.net/killerggf/article/details/6216102 有两个表A和表B. 表A结构如下: Aid:int:标识种子,主键,自增ID ...
- 写jQuery插件
如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...