大家好,又见面了,我是你们的朋友全栈君。
1 、varchar2 在数据库表中的最大长度是4000 bytes or character,在 oracle plsql varchar2最大支持长度为32767个字节
SQL> declare
2 v_var varchar2(32767);
3 begin
4 null;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL> declare
2 v_var varchar2(32768);
3 begin
4 null;
5 end;
6 /
v_var varchar2(32768);
*
第 2 行出现错误:
ORA-06550: 第 2 行, 第 22 列:
PLS-00215: 字符串长度限制在范围 (1…32767)
SQL> declare
2 v_var varchar2(32767 byte);
3 v_char varchar2(32767 char);
4 begin
5 v_var := lpad(‘a’,32767,’a’);
6 dbms_output.put_line(length(v_var));
7 v_char := lpad(‘中’,32767,’中’);
8 dbms_output.put_line(lengthb(v_var));
9 v_var := lpad(‘中’,32768,’中’);
10 end;
11 /
declare
*
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ORA-06512: 在 line 9
2 、索引的长度有限制
SQL> create table t ( a varchar2(4000), b varchar2(4000));
表已创建。
SQL> create index i on t(a,b);
create index i on t(a,b)
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (6398)
3、
ORACLE中VARCHAR2类型的字段长度是按照byte来定义的。如果数据库使用的字符集是GBK,GB2312或者其他定长字符集的话,这个问题似乎可以被忽略,因为只要把数据库的字段长度/2就可以得到你要限制插入该字段的中文长度了。 但是,如果数据库的字符集是UTF-8呢,杯具了吧,人家是变长的。
其实人家ORACLE没这么笨,本来就可以用字符为单位来定义varchar2的长度的,这个时候需要注意在建表时这样写:createtable ABC_TABLE (A_FIELD varchar2(20 char))
这个varchar2(2 char)就表示了是用字符为单位来定义了,而默认情况下的varchar2(2)这样就是字节!
SQL> create table AB (A varchar2(2 char)) ;
表已创建。
SQL> insert into ab values(‘如果’);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select *From ab;
A
—-
如果
SQL> create table ABc (A varchar2(2)) ;
表已创建。
SQL> insert into abc values(‘如果’);
insert into abc values(‘如果’)
*
第 1 行出现错误:
ORA-12899: 列 “SCOTT”.”ABC”.”A” 的值太大 (实际值: 4, 最大值: 2)
如果你不确定数据库里究竟是怎么定义,你想找出所有采用字节定义长度的字段,
select * from user_tab_columnswhere CHAR_USED=‘B’
这里的CHAR_USED的意思是:如果是字符定义-‘C’,字节定义-‘B’
4VARCHA2可能导致的问题是行迁移。
如果varchar2列被修改,而且修改后数据长度增大,这会引起‘行迁移’(Row Migration),造成多余的I/O。主要影响:行迁移和行链接,直接导致数据读取和写入IO增多
5 varhcar2和char的区别
SQL> create table t( a varchar2(3),b char(3));
表已创建。
SQL> insert into t values(‘a’,’a’);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select *From t;
A B
— —
a a
SQL> select dump(a),dump(b) from t;
DUMP(A)
——————————————————————————–
DUMP(B)
——————————————————————————–
Typ=1 Len=1: 97
Typ=96 Len=3: 97,32,32
从dump中可以看出varchar2的存储长度是1,而char类型的长度是3,其余空间被空格填充;
参考:http://doingwell.iteye.com/blog/972938
http://www.linuxidc.com/Linux/2012-03/56006.htm
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149491.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...