ORACLE VARCHAR2最大长度问题

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 any multibyte 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;


ORACLE VARCHAR2最大长度问题

时间: 2024-12-07 00:37:05

ORACLE VARCHAR2最大长度问题的相关文章

Oracle varchar2最大支持长度(转)

oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, numeric, string, conversion, or constraint error// occurred. For example, this error occurs if an attempt is made to// assign the value NULL to a variable de

mysql varchar vs oracle varchar2

1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为数据库里的表设置的字符集不相同. 解决办法: varchar(10) ——>varchar(20) alter table `cms_activity_test` convert to character set gbk collate gbk_chinese_ci;(单独修改指定表的字符集) 其他

oracle获取字符串长度函数length()和hengthb()

原文:oracle获取字符串长度函数length()和hengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算string所占的字符长度:返回字符串的长度,单位是字符 对于单字节字符,LENGTHB和LENGTH是一样的. 如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文. 注: 一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为

[原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题

注:本文出自:博主自己研究验证可行   [原著]java或者Js  代码逻辑来处理  突破 oracle  sql "IN"长度的极限的问题    在很多的时候 使用 select  *  from  tab_name t where  t.id in (1,2----1000) ;  的固定方式来查询数据的时候.会有一种这个情况出现: 则是 in 里面的内容 太长了: 而 oracle数据库支持的长度是 100个内容.          那么对于这个情况该怎么办呢.其实是很简单的,i

Oracle Varchar2长度 及 PHP 长度判断

oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型.          对应该类型,在oracle中有三种比较常用的类型:varchar2(byte).varchar2(char).nvarchar2().          那么这三种类型到底有什么区别呢?          首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节数都是4000. varchar2(byte):就是默认的表示方式,比如我们写成:varchar2(100),就相当

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

Oracle定义字符串类型VARCHAR2和CHAR指定长度的用法如下: varchar2(<SIZE> <BYTE|CHAR>) <SIZE>是介于1~4000之间的一个数,表示最多占用4000字节的存储空间.char(<SIZE> <BYTE|CHAR>) <SIZE>是介于1~2000之间的一个数,表示最多占用2000字节的存储空间.那其中的BYTE和CHAR有什么区别呢BYTE,用字节指定:VARCHAR2(10 BYTE).

Oracle修改字段长度以及计算天数

sql修改字段长度的语法: alter table 表名 modify 字段名 字段类型; sql修改字段长度的示例代码 alter table qtline modify qtl_bidernote VARCHAR2(4000); 标准SQL,对任何数据库都适用 alter table fzrtmis.reporttemplate modify REPNAME varchar(100): 修改字段名名称 ALTER TABLE TABLENAME RENAME COLUMN COL1 TO C

oracle创建固定长度的自增ID

ORACLE的编号和SQL SERVER的不同,SQL SERVER可以设置一个值为自增. ORACLE需要先建立一个SEQUENCE,然后用NEXTVAL. 例如,若想生成这样的编码,0001,0002,0003...... 首先建立一个1-n的整数循环序列, CREATE SEQUENCE DATE_SEQ START WITH 1 --起始值(默认为1可省略) INCREMENT BY 1 --可省略(默认为1可省略) MAXVALUE 9999 --最大值9999 CYCLE --循环

oracle取字符串长度的函数length()和hengthb()

http://blog.itpub.net/161195/viewspace-613263/ lengthb(string)计算string所占的字节长度 :返回字符串的长度,单位是字节 length(string)计算string所占的字符长度 :返回字符串的长度,单位是字符 对于单字节字符,LENGTHB和LENGTH是一样的. 如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文. 转自网络: http://topic.csdn.net/t/2