ORACLE VARCHAR2最大长度问题

url:http://www.cnblogs.com/kerrycode/p/3833746.html

2014-07-09 15:53 by 潇湘隐者,

VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型。简单的说,要看你在什么应用场景下,否则难以回答VARCHAR2数据类型的最大长度问题。

ORACLE数据库字段类型

关于Oracle Database中的字段的VARCHAR2类型的最大长度,我们先看下面的例子:

SQL> create table test ( name varchar2(4001) );
create table test ( name varchar2(4001) )
                                  *
ERROR at line 1:
ORA-00910: specified length too long for its datatype
 
 
SQL> create table test ( name varchar2(4000) ); 
 
Table created.

如上所示,在Oracle Database中,VARCHAR2字段类型,最大值为4000,SQL参考手册中也明确指出VARCHAR2的最大大小为4000,注意此处的最大长度是指字节长度,而不是指字符个数。这个跟参数NLS_LENGTH_SEMANTICS有一定关系,如下所示,当参数NLS_LENGTH_SEMANTICS为字节时,定义的变量长度为字节长度

如下所示,本数据库NLS_CHARACTERSET值为AL32UTF8,一个汉字占三个字节

SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE; 
 
Session altered 
 
SQL> DROP TABLE TEST PURGE; 
 
Table dropped 
 
SQL> CREATE TABLE TEST ( NAME VARCHAR2(7)); 
 
Table created 
 
SQL> INSERT INTO TEST VALUES ('字'); 
 
1 row inserted 
 
SQL> COMMIT; 
 
Commit complete 
 
SQL> INSERT INTO TEST VALUES('字字字'); 
 
INSERT INTO TEST VALUES('字字字') 
 
ORA-12899: value too large for column "SYSTEM"."TEST"."NAME" (actual: 9, maximum: 7) 
 
SQL> SELECT LENGTH(NAME), LENGTHB(NAME) FROM TEST; 
 
LENGTH(NAME) LENGTHB(NAME) 
 
------------ ------------- 
 
1 3 
 

如果将参数NLS_LENGTH_SEMANTICS,则定义VARCHAR2(7)表示

SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR; 
 
Session altered 
 
SQL> DROP TABLE TEST; 
 
Table dropped 
 
SQL> CREATE TABLE TEST ( NAME VARCHAR2(7)); 
 
Table created 
 
SQL> INSERT INTO TEST VALUES ('字'); 
 
1 row inserted 
 
SQL> COMMIT; 
 
Commit complete 
 
SQL> INSERT INTO TEST VALUES('字字字'); 
 
1 row inserted 
 
SQL> COMMIT; 
 
Commit complete 
 
SQL> SELECT LENGTH(NAME), LENGTHB(NAME) FROM TEST; 
 
LENGTH(NAME) LENGTHB(NAME) 
 
------------ ------------- 
 
1                 3 
 
3                 9 
 

不管参数NLS_LENGTH_SEMANTICS取值为字符或字节,其所能容纳的字符串的字节数都不能超过4000.

PL/SQL变量类型:

接下来我们看看PL/SQL中VARCHAR2变量类型,如下官方文档所示,它的最大字节长度为32767,所能容纳的字符个数取决于字符集。

Declaring Variables for Multibyte Characters

The maximum size of a CHAR or VARCHAR2 variable is 32,767 bytes, whether you specify the maximum size in characters or bytes. The maximum number of characters in the variable depends on the character set type and sometimes on the characters themselves:

Character Set Type

Maximum Number of Characters

Single-byte character set

32,767

n-byte fixed-width multibyte character set (for example, AL16UTF16)

FLOOR(32,767/n)

n-byte variable-width multibyte character set with character widths between 1 and n bytes (for example, JA16SJIS or AL32UTF8)

Depends on characters themselves—can be anything from 32,767 (for a string containing only 1-byte characters) through FLOOR(32,767/n) (for a string containing only n-byte characters).

When declaring a CHAR or VARCHAR2 variable, to ensure that it can always hold n characters in anymultibyte character set, declare its length in characters—that is, CHAR(n CHAR) or VARCHAR2(n CHAR), where n does not exceed FLOOR(32767/4) = 8191.

可以通过下面一个PL/SQL代码来验证一下,如下所示,可以定义一个VARCHAR2类型的变量,给其赋值6000个字符串。

 
DECLARE
    V_OUT VARCHAR2(32767);
BEGIN
     V_OUT := RPAD('T', 6000, 'M');
     DBMS_OUTPUT.PUT_LINE(LENGTH(V_OUT));
END;

如果给VARCHAR2类型变量赋值超过23767,就会报PLS-00215: String length constraints must be in range (1 .. 32767)错误。

DECLARE
    V_OUT VARCHAR2(32768);
BEGIN
     V_OUT := RPAD('T', 5000, 'M');
     DBMS_OUTPUT.PUT_LINE(LENGTH(V_OUT));
END;

作者: 潇湘隐者
出处: http://www.cnblogs.com/kerrycode/

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

ORACLE VARCHAR2最大长度是4000?还是32767?相关推荐

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

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

  2. oracle数据长度超过4000,有没有办法,突破VARCHAR2最大长度是4000的限制

    dbms_lob包学习笔记之二:append和write存储过程 发表人:www.wwf.co | 发表时间: 2005年四月27日, 14:30 两个写数据的存储过程 dbms_lob.append ...

  3. 【SQL开发实战技巧】系列(四十五):Oracle12C常用新特性☞VARCHAR2/NVARCHAR2类型最大长度由4000字节扩展到32767字节

    系列文章目录 文章目录 系列文章目录 前言 Oracle12C常用新特性☞VARCHAR2/NVARCHAR2类型最大长度由4000字节扩展到32767字节 案例一:CDB+PDB环境启用扩展 案例二 ...

  4. Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异

    目录 1简介... 1 2 准备... 1 2.1 环境说明... 1 3 安装... 2 4 配置... 2 5 使用... 3 5.1 验证实验... 3 5.2 问题分析... 5 6 延展.. ...

  5. Oracle clob怎么存储超过4000长度的数据,你了解吗

    目录 方式一.使用存储过程: 方式二.使用to_clob函数 方式三.mybatis中的方法 附: oracle将把varchar2字段(长度4000)改为clob类型 参考资料: 题记:我们知道Or ...

  6. Oracle varchar2 4000

    关于oracle varchar2 官方文档的描述 VARCHAR2 Data TypeThe VARCHAR2 data type specifies a variable-length chara ...

  7. oracle插入CLOB类型超过4000个字符报ORA-01704错的解决方法及其它相关场景解决方案...

    最近有位朋友问我:开发中向CLOB字段存储string时报了ORA-01704的错误不知道怎么解决.首先造成这个问题的原因相信大家都明白,就是因为插入的字符串过长导致,因为oracle在插入CLOB的 ...

  8. oracle插入CLOB类型超过4000个字符报ORA-01704错的解决方法

    今天碰到一个问题,测试童鞋希望把tomcat的报错日志报错到数据库中,结果调用insert into的时候,报ORA-01704. INSERT INTO SYSTEM.QYQTEST2021(ID, ...

  9. oracle 修改字段长度_Oracle字段长度引起的思考length()和lengthb()

    "小X,问个问题啊,我这里想往一个表里插入另一张表的值.都是vachar2()字段,用length()看,原表那些值的长度都在20以下,目标表是varchar2(22),怎么会报错插入失败, ...

最新文章

  1. BZOJ 2592 随机化(伪)
  2. 【Java核心计算 基础知识(第9版)】第3章 Java的基本程序设计结构
  3. [H265/HEVC]开源项目
  4. uva 10883——Supermean
  5. ios 返回指定导航控制器
  6. 原生的文件上傳和下载
  7. 【Oracle】非RMAN恢复数据文件、控制文件
  8. Linux 配置mail发送邮件
  9. Springboot项目中Maven Plugin各个插件的版本控制
  10. Windows Hello 摄像头人脸识别解锁 DELL拆机摄像头方案
  11. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java影视资源分享论坛23562
  12. 工具-如何屏蔽浏览器中的广告(Adblock Plus(广告屏蔽器))
  13. 给你一碗孟婆汤,你会选择遗忘什么?
  14. 弱网优化,GCC 动态带宽评估算法(内附详细公式)
  15. C语言二叉树叶子节点的求法
  16. 西安音乐学院人计算机学院,西安音乐学院.我校5部作品“中国大学生计算机设计大赛”获奖...
  17. 智能家居系统 Home Assistant 系列 --介绍篇
  18. 史上最强的绕口令.没人能读出.要不你试试?
  19. 星战前夜无烬星河服务器维护中,星战前夜无烬星河异常空间攻略 刷异常技巧分享...
  20. 面兜兜1688上货助手 V1.0.8

热门文章

  1. 携程笔试(惨败经历)第一题 leetcode 253
  2. What is Nginx?
  3. ubantu报错: 正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程3228(aptd)
  4. 单端与差分的接线方法
  5. win11 修改host文件,亲测简单有效
  6. DS1820温度测量程序
  7. 大连 计算机培训姚嵩,俄语在对外汉语教学中实际的应用姚嵩.pdf
  8. 2022-2028全球与中国药房管理系统市场现状及未来发展趋势
  9. 关于usecase新建与构造配置
  10. Adept即将亮相2013中国国际机器人展