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 ...
随机推荐
- ASP.NET通过byte正确安全的判断上传文件格式
本文介绍一种更安全的方式上传图片,他能有效的防止一些通过修改文件后缀或MIME来伪造的图片的上传,从而保证服务器的安全,希望对大家有所帮助. ASP.NET中在判断文件格式时,我们以前常用的方法就是通 ...
- android网络请求库volley方法详解
使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列 ...
- 重构21-Collapse Hierarchy(去掉层级)
我们通过提取子类来下放职责.,当我们意识到不再需要某个子类时,可以使用Collapse Hierarchy重构.如果某个子类的属性(以及其他成员)可以被合并到基类中,这时再保留这个子类已经没有任何意义 ...
- jQuery:节点(插入,复制,替换,删除)操作
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 《UNIX环境高级编程》学习心得 二
窝萌来看我们看到这本书里的第一个程序 #include "apue.h" #include <dirent.h> int main(int argc, char *ar ...
- javascript事件代理(委托)
之前有接触过事件代理,但是印象并不深刻.这次记下来加强印象. 用个大家比较常见的代码举例子: html dom结构: <ul id="ul1"> <li>0 ...
- 拓展开源库SwipeToLoadLayout实现EmptyView和Empty时自动禁用LoadMore
Android应用开发中,经常需要使用到界面的下拉刷新和上拉加载,在support v7之前,一般都是用ListView去做列表视图,而ListView对EmptyView是提供支持的,并且有许多开源 ...
- Part 7 Joins in sql server
Joins in sql server Advanced or intelligent joins in sql server Self join in sql server Different wa ...
- DWZ 验证 CLASS 规则
验证:格式 class="XXXX" 即可验证. required: "必填字段", remote: "请修正该字段", email ...
- Shell脚本报错unary operator expected
在匹配字符串时用了类似这样的语句 if[ $timeofday = "yes"]; then echo "Good morning" exit 0 报错的原因是 ...