`
oywl2008
  • 浏览: 1051982 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于 varchar2 的最大长度

 
阅读更多

关于 varchar2 的最大长度
varchar2有两个最大长度:一个是在字段类型4000;一个是在PL/SQL中变量类型32767。今天犯了一个小错误,就是函数的varchar2类型的返回值长度也是4000,而不是我以为的32767。
 
想了一下,这是一个比较容易出错的地方。因为在函数中我可以声明长度超过4000的字符串变量,并且将它作为返回值,这里是不会提示编译错误的。这个函数平时都可以正常执行,而一旦这个字符串长度超过4000,函数执行就会出错。所以这个问题虽然比较简单,仍然记录一下。
 
C:\Documents and Settings\yuechao.tianyc>sqlplus
 
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 5月 5 17:15:59 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
请输入用户名:  test/test
 
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
 
SQL> create or replace function funny return varchar2
  2  is
  3    v_yct varchar2(32767);
  4  begin
  5    v_yct := rpad('a', 4001, 'b');
  6    return v_yct;
  7  end;
  8  /
 
函数已创建。
 
SQL> select funny from dual;
select funny from dual
       *
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 "TEST.FUNNY", line 6
 
本来以为记录下来就好。刚才跟一位同事讨论了一下,认为有可能在schema级varchar2的长度限制都是4000,而在PL/SQL代码级的长度限制是32767。下面继续测试:
 
-- 1. 作为函数入参的限制是32767
SQL> create or replace function funny( p_char in varchar2 ) return number
  2  is
  3  begin
  4    return length(p_char);
  5  end;
  6  /
 
函数已创建。
 
SQL> declare
  2    v_char varchar2(32767);
  3  begin
  4    v_char := rpad('a', 32767, 'b');
  5    dbms_output.put_line(funny(v_char));
  6  end;
  7  /
32767
 
PL/SQL 过程已成功完成。
 
-- 2. 同样的函数,在schema级和在PL/SQL代码级长度限制不同
SQL> select length(rpad('a', 4001, 'b')) from dual;
 
LENGTH(RPAD('A',3276558,'B'))
-----------------------------
                         4000
 
SQL> begin
  2    dbms_output.put_line(length(rpad('a', 4001, 'b')));
  3  end;
  4  /
4001
 
PL/SQL 过程已成功完成。
 
 
如果中间结果字符串长度超过限制会怎样呢?
 
(1)在PL/SQL中,如果中间结果超过32767,没有影响:
 
SQL> declare
  2    v_char1 varchar2(32767);
  3    v_char2 varchar2(32767);
  4    v_char3 varchar2(10);
  5  begin
  6    v_char1 := lpad('a', 32767, 'a');
  7    v_char2 := lpad('b', 32767, 'b');
  8    v_char3 := substr(v_char1 || v_char2, 32763, 10);
  9    dbms_output.put_line(v_char3);
 10  end;
 11  /
aaaaabbbbb
 
PL/SQL 过程已成功完成。
 
(2)在schema级如果中间结果超过4000,会提示错误:
 
SQL> select substr(rpad('a', 4000, 'a')||rpad('b', 4000, 'b'), 3996, 10) from dual;
select substr(rpad('a', 4000, 'a')||rpad('b', 4000, 'b'), 3996, 10) from dual
                                                                         *
第 1 行出现错误:
ORA-01489: 字符串连接的结果过长
 
 
如果字符串长度超过限制怎么办?可以使用CLOB类型。比如最开始的那个例子,可以将返回值改为CLOB类型:
 
SQL> create or replace function funny return clob
  2  is
  3    v_yct varchar2(32767);
  4  begin
  5    v_yct := rpad('a', 4001, 'b');
  6    return v_yct;
  7  end;
  8  /
 
函数已创建。
 
SQL> select funny from dual;
 
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
 
SQL> set long 10000
SQL> select funny from dual;
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
.
 
这样返回字符串的最大长度就是32767了。

 

 

Link : http://www.blogjava.net/wangbing/archive/2010/03/15/315482.html

 

 

 

 

分享到:
评论

相关推荐

    Mysql中varchar长度设置方法

    在MySQL 5.1及以上版本中,`VARCHAR`的最大长度为65,535字节,但这并不意味着你可以直接存储65,535个字符。由于长度前缀可能会占用1到2个字节,实际的最大字符数会略小于65,535。对于UTF-8编码,这意味着最大字符数...

    varchar 和varchar2之间的联系和区别

    1. **最大长度**:`VARCHAR`的最大长度为4000个字符,而`VARCHAR2`的最大长度则可达32767个字符。 2. **空格处理**:`VARCHAR`不会自动去除尾部的空格,这意味着如果插入的字符串后面有空格,这些空格也会被保存下来...

    mysql VARCHAR的最大长度到底是多少

    关于VARCHAR的最大长度,确实存在一些误解。通常认为VARCHAR的最大长度为65,535个字节,但这并不完全正确。实际上,这个最大值是基于存储机制和字符编码的限制。在MySQL中,VARCHAR长度是通过一个或两个字节来表示的...

    oracle中varchar2(byte)和varchar2(char).doc

    综上所述,`VARCHAR2(BYTE)`和`VARCHAR2(CHAR)`的主要区别在于长度单位的不同:前者按字节计数,后者按字符计数。在实际应用中,根据数据的具体特点选择合适的长度单位是非常重要的。特别是在处理包含大量非ASCII...

    char,varchar以及varchar2的区别

    例如,`varchar2`的最大长度通常小于`varchar`,并且Oracle对`varchar2`的数据进行了更严格的校验,这有助于减少因数据格式错误引发的问题。此外,Oracle建议优先使用`varchar2`,因为它在内部处理上更为高效。 **...

    oracle char,varchar,varchar2的区别和使用方法

    - **定义**:`CHAR` 类型是一种固定长度的字符类型,即无论实际存储的数据长度如何,它都会占用预先设定的最大长度的空间。 - **示例**:如果创建了一个 `CHAR(20)` 类型的字段,并插入 "abc",那么即使实际只用了 3...

    MySQL动态修改varchar长度的方法

    4. 在MySQL 5.0.45版本(使用`UTF-8`编码)中,`VARCHAR`字段的最大长度被限制为21785个字符,因为65535字节减去2字节的长度前缀,再除以3(UTF-8编码的平均字节数)等于21785。 5. 虽然`VARCHAR`在存储时会去除...

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    首先,char 是定长的字符串类型,例如 char(10) 表示这个字段的长度是 10 个字符,如果我们存储的数据少于 10 个字符,剩下的空间将被空格填充,而 varchar2 则不同,varchar2(10) 只是表示这个字段的最大长度是 10 ...

    Mysql varchar大小长度问题介绍

    例如,GBK编码中每个字符最多占用2字节,所以VARCHAR的最大长度为65535 / 2 = 32767个GBK字符;而在UTF-8编码下,每个字符最多占用3字节,最大长度为65535 / 3 = 21845个UTF-8字符。 3. **行长度限制**:MySQL对一...

    GP数据库表结构转mysql库、oracle库 varchar类型字段长度批量处理excel_MYSQL_oracle_数据库

    对于varchar字段,可能需要在转换前对源数据进行分析,确定实际的最大长度,然后在MySQL中设置合适的varchar长度,以平衡存储效率和数据完整性。 文件“mpp数据库长度转换.xls”很可能包含了一个表格,列出了源...

    探究MySQL中varchar的定义长度

    首先,`VARCHAR`的最大长度由创建表时指定,例如`VARCHAR(10)`表示列`name`最多可以存储10个字符。但这里的“字符”并非指我们通常理解的文本字符,而是指特定字符集下的字节序列。不同的字符集,如UTF-8和GBK,对每...

    Oralce中VARCHAR2()与NVARCHAR2()的区别介绍

    而在NVARCHAR2(6)表中,同样是因为超过最大长度限制,插入操作同样失败。这显示了尽管它们在字节长度上有所不同,但都遵循指定的字符长度。 总结来说,Oracle中的VARCHAR2()适合存储非Unicode字符串,而NVARCHAR2()...

    php判断输入不超过mysql的varchar字段的长度范围

    当你创建一个表并为一个字段指定varchar类型时,你需要定义一个最大长度,这个长度的范围是1到65535个字符。比如,当你定义一个字段为varchar(10)时,意味着这个字段最多能存储10个字符的数据。 在大多数字符编码中...

    Oracle接收长度大于4000的字符串

    在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...

    python遇到sql2005 varchar(4000) varchar(MAX)

    varchar(4000)表示最大能存储4000个字符,而varchar(MAX)则可以存储最多2^31-1个字符,即大约2GB的数据。 在实际应用中,当Python需要与SQL Server交互,特别是涉及大数据量的varchar(MAX)字段时,可能会出现一些...

Global site tag (gtag.js) - Google Analytics