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最大长度问题的更多相关文章
- Oracle varchar2最大支持长度(转)
oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...
- oracle varchar2 和varchar 区别
今天,往ORACLE一个表的VACHAR2(20)字段中插入七个汉字,提示错误:插入的值太大. 改成插入六个汉字,又可以. 一直以来,都以为一个汉字占两个字节.觉得非常奇怪. 用length().le ...
- mysql varchar vs oracle varchar2
1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为 ...
- Oracle varchar2 4000
关于oracle varchar2 官方文档的描述 VARCHAR2 Data Type The VARCHAR2 data type specifies a variable-length char ...
- oracle获取字符串长度函数length()和hengthb()
原文:oracle获取字符串长度函数length()和hengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算s ...
- [原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题
注:本文出自:博主自己研究验证可行 [原著]java或者Js 代码逻辑来处理 突破 oracle sql "IN"长度的极限的问题 在很多的时候 使用 select ...
- Oracle数据库 number 长度与 Short Integer Long BigDecimal 对应关系
转自:https://blog.csdn.net/edward9145/article/details/21398657 Oracle数据库 number 长度与 Short Integer Long ...
- oracle获取字符串长度函数length()和lengthb()
oracle获取字符串长度函数length()和lengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算st ...
- Oracle Varchar2长度 及 PHP 长度判断
oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型. 对应该类型,在oracle中有三种比较常用的类型:varchar2(byte).varchar2( ...
随机推荐
- winform中textbox属性Multiline=true时全选
1.文本框右键属性 => 添加KeyDown事件. 2.添加如下代码: private void txt_result_KeyDown(object sender, KeyEventArgs e ...
- new的探究
new操作符易用,但是往往容易忽略对其的理解. var foo= new Foo(); 这个简单的语句,涉及到了一系列的步骤: 1),给对象开辟内存,即 var foo= {}; 2),修改新对象的隐 ...
- BOM详解
1.WINDOW对象 BOM的核心对象是WINDOW,它表示一个浏览器的实例.在浏览器中,window对象有双重角色,它既是通过 JavaScript访问浏览器的一个接口,又是ECMAScript规定 ...
- 1.Java基础之System对象
毕向东老师Java基础学习笔记——System对象 今天学习Java中的System对象后,感觉这个对象对我们主要有以下几点用处. 1.获取当前操作系统版本和类型. 2.获取当前操作系统的path中的 ...
- 【Python实战】Pandas:让你像写SQL一样做数据分析(二)
1. 引言 前一篇介绍了Pandas实现简单的SQL操作,本篇中将主要介绍一些相对复杂一点的操作.为了方便后面实操,先给出一份简化版的设备统计数据: 0 android NLL 387546520 2 ...
- git切换到远程分支
远程仓库 git clone 下来,当你执行 git branch,你只会看到 * master 并不会看到其他分支,即便远程仓库上有其他分支,使用 git branch -va 可以查看本地+远程分 ...
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
- javascript的 Object 和 Function
一. javascript 的 内置对象: Object 和 Function javascript所有东西,包括 Function 都是对象 . Array 其实是一个 Function 类型的对 ...
- bzoj 1001狼抓兔子(对偶图+最短路)最大流
推荐文章:<浅析最大最小定理在信息学竞赛中的应用>--周冬 题目 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- 工业串口和网络软件通讯平台(SuperIO 2.1)更新发布
SuperIO 2.1下载 一.SuperIO 的特点: 1) 能够很快的构建自己的通讯平台软件,包括主程序. 2) 设备模块化开发,通过配制文件挂载,即可在平台软件下运行. 3) 设备 ...

