关于oracle varchar2 官方文档的描述

VARCHAR2 Data TypeThe 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 ProductionSQL> select * from v$nls_parameters t where t.PARAMETER='NLS_LENGTH_SEMANTICS';PARAMETER                                                        VALUE
---------------------------------------------------------------- ----------------
---------
NLS_LENGTH_SEMANTICS                                             BYTESQL>

创建测试表

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 t2  where rownum <148;LENGTH(LISTAGG(T.USERNAME)WITHINGROUP(ORDERBYT.USERID)||'中国石化')
-------------------------------------------------------------------2000SQL> insert into test_varchar2_datatype(char_1,2                                     char_2,3                                     char_3,4                                     char_21,5                                     char_22,6                                     char_237                                     )8  select9  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 t16  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_236                                     )7  select8  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 t14  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_225                                     )6  select7  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 t12  where rownum <148;已创建 1 行。SQL> commit;SQL> select length(listagg(t.username) within group (order by t.userid)||'中国石化') from t_char_source t2  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 官方文档有描述。

转载于:https://www.cnblogs.com/Alex-Zeng/p/5209707.html

Oracle varchar2 4000相关推荐

  1. ORACLE VARCHAR2最大长度是4000?还是32767?

     ORACLE VARCHAR2最大长度问题 url:http://www.cnblogs.com/kerrycode/p/3833746.html 2014-07-09 15:53 by 潇湘隐 ...

  2. oracle修改表字段从varchar2(4000)为clob

    oracle修改表字段从varchar2(4000)为clob (原因varchar2(4000)不够用了) 1.临时表存数据 2.删原表数据,修改字段类型为long,才能再改为clob 3.导回数据 ...

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

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

  4. oracle varchar2改成大字段类型clob,读取大字段内容

    oracle varchar2(4000)改成大字段类型clob,如果需要改成大字段的varchar2列有内容,不能直接用 alter table med_generic modify option0 ...

  5. ORACLE VARCHAR2最大长度问题[作者:潇湘隐者]

    url:http://www.cnblogs.com/kerrycode/p/3833746.html 2014-07-09 15:53 by 潇湘隐者, 作者:潇湘隐者 出处:http://ww ...

  6. oracle varchar2 赋值给clob,VARCHAR2转换为CLOB碰到ORA-22858错误

    今天开发人员问我如何将一个VARCHAR2类型的字段转化为CLOB类型. 记得在9i及以前版本是不能直接转换的,不过10g以上版本还真没有注意过这个问题,测试了一下直接转换,果然碰到了ORA-2285 ...

  7. Oracle 被 4000 多名女性员工集体诉讼:因薪资比男性每年少 1.3 万美元

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 网络 Oracle正缠身一起薪资歧视诉讼,诉讼 ...

  8. oracle varchar2() 占几个字母,Oracle number date varchar2字段类型占用空间大小

    oracledate类型占用存储空间是7个字节oraclevarchar2类型占用存储空间是每个字符占用一个字节oraclenumber类型占用存储空间是几个字节number最少占用两个字节, ora ...

  9. Oracle VARCHAR2超过4000字节-数据库修改

    1,以sysdba连接数据库   [oracle]$ sqlplus /  as sysdba   SQL> show parameter COMPATIBLE ;              - ...

最新文章

  1. 听说数据标注行业缺“中立”平台,京东金融竖起了大旗
  2. 最新离婚大数据曝光:所有的分手,都是蓄谋已久
  3. R语言包_plotly
  4. mysql img格式缩放,再学 GDI+[89]: TGPImage(9) - 图像缩放时的质量(算法)
  5. ERP兵法——从案例透视方法(实施篇上)
  6. android怎么ota升级,Android OTA升级过程
  7. hive数据倾斜及处理案例
  8. 统计处理包Statsmodels: statistics in python
  9. 服务器系统小米随身wifi,win8.1系统安装小米随身wifi驱动详细操作步骤【图文教程】...
  10. Hive调优全方位指南(推荐收藏)
  11. vscode c语言插件_推荐学习C语言或CPP使用的代码编辑器
  12. k8s中安装traefix并配置dashboard访问权限
  13. jQuery插件使用-瀑布流
  14. 《android开发艺术探索》笔记:Activity界面跳转到透明主题界面,不调用onStop()方法
  15. ubuntu16.04连接android手机蓝牙共享网络热点
  16. Google软件测试之道(读书笔记)
  17. 纸质合同扫描存档和电子合同签字盖章的区别
  18. jnz和djnz_求汇编语言指令,最好详细些
  19. [JAVA]数字摘要算法工具类——(Hamc)MD5/SHA1/SHA256/SHA512/PBKDF2
  20. LVS 负载均衡群集----NAT模式

热门文章

  1. python行业中性_用python进行金融市场文本数据的情感计算
  2. WEB 前端开发插件整理
  3. python的常见矩阵除法_Python矩阵除法
  4. 5分钟,10行代码!带你用Python做个电脑文件清道夫!
  5. python定义函数,随机生成6位的密码(字母数字随机组合,包含大小写)
  6. MBA-day32 绝对值的几何意义
  7. 腾讯视频解析,Java实现
  8. css3 图片裁剪菱形,利用CSS3 clip-path裁剪各种图形。
  9. invalid button size rid: 5fd188c8-1d752f57-0d53f85f
  10. 一级市场二级化:区块链正在颠覆风险投资