ORACLE VARCHAR2最大长度问题
VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型。简单的说,要看你在什么应用场景下,否则难以回答VARCHAR2数据类型的最大长度问题。 ORACLE数据库字段类型 关于Oracle Database中的字段的VARCHAR2类型的最大长度,我们先看下面的例子: SQL> create table test ( name varchar2(4001) ); table test ( name varchar2(4001) )
* ERROR at line 1:
ORA-00910: specified length too long for its datatype
table test ( name varchar2(4000) ); Table created.
如上所示,在Oracle Database中,VARCHAR2字段类型,最大值为4000,SQL参考手册中也明确指出VARCHAR2的最大大小为4000,注意此处的最大长度是指字节长度,而不是指字符个数。这个跟参数NLS_LENGTH_SEMANTICS有一定关系,如下所示,当参数NLS_LENGTH_SEMANTICS为字节时,定义的变量长度为字节长度 如下所示,本数据库NLS_CHARACTERSET值为AL32UTF8,一个汉字占三个字节 ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE; Session altered DROP TABLE TEST PURGE;
Table dropped CREATE TABLE TEST ( NAME VARCHAR2(7));
Table created SQL> INSERT INTO TEST VALUES ('字'); 1 row inserted
COMMIT; Commit complete VALUES('字字字');
INSERT '字字字')
ORA-12899: value too large for column "SYSTEM"."TEST"."NAME" (actual: 9,maximum: 7) SELECT LENGTH(NAME),LENGTHB(NAME) FROM TEST;
LENGTH(NAME) LENGTHB(NAME) ------------ -------------
1 3 如果将参数NLS_LENGTH_SEMANTICS,则定义VARCHAR2(7)表示 SET NLS_LENGTH_SEMANTICS=CHAR;TABLE TEST; 1 3 3 9 不管参数NLS_LENGTH_SEMANTICS取值为字符或字节,其所能容纳的字符串的字节数都不能超过4000. 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)错误。 V_OUT VARCHAR2(32768); V_OUT := RPAD( DBMS_OUTPUT.PUT_LINE(LENGTH(V_OUT));
|