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( ...
随机推荐
- 【记录】ASP.NET XSS 脚本注入攻击
输入进行 Html 转码: HttpUtility.HtmlEncode(content); 输入保留 Html 标记,使用 AntiXSS 过滤: Install-Package AntiXSS M ...
- php使用post方式获得文件扩展名
<form action="" method="post"> <input type="file" value=" ...
- Oracle Recovery 01 - 常规恢复之完全恢复
背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 DG primary. 一.常规恢复之完全恢复:不丢失数据 1.1 单 ...
- C#二进制流的序列化和反序列化
public class BinaryHelper { /// <summary> /// 将对象序列化为byte[] /// 使用IFormatter的Serialize序列化 /// ...
- IO多路复用之epoll总结
1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll使用一个文件描述符管理多个描述 ...
- 用Groovy构建java脚本
我是做工作流项目的,工作流中各个模板引擎都需要要执行一个动态业务,这些动态业务有多种实现方式,最常用的就是用户自己写一段脚本文件,然后工作流引擎执行到这里的时候,运行这个脚本文件. 这个运行脚本文件的 ...
- Struts2 源码分析——配置管理之ContainerProvider接口
本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...
- .Net语言 APP开发平台——Smobiler学习日志:如何在手机上实现电子签名功能
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的“Smobil ...
- sessionPageState与视图状态存储
这个配置节甚是简单,在MSDN中的介绍也甚是简单:为 ASP.NET 应用程序配置页的视图状态设置. historySize的作用是设置要存储在页历史记录中的项数. 但是这根本是看不明白他是干嘛的,百 ...
- Devexpress RaisePropertyChanged
所有的重载设置字段作为参数传递到指定的值,而属性提高INotifyPropertyChanged.PropertyChanged事件. 如果一个字段已经成功地改变,setProperty方法中返回真. ...

