`
doingwell
  • 浏览: 33970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE中VARCHAR2类型的字段长度是按照byte来定义的-一个容易被忽略的问题

阅读更多

很多新手在建数据库或添加表、字段时,会这样忽略一个问题:ORACLE中VARCHAR2类型的字段长度是按照byte来定义的。如果数据库使用的字符集是GBK,GB2312或者其他定长字符集的话,这个问题似乎可以被忽略,因为只要把数据库的字段长度/2就可以得到你要限制插入该字段的中文长度了。 但是,如果数据库的字符集是UTF-8呢,杯具了吧,人家是变长的。

    有人说数据库字段长度/3,这是一定不可取的,因为UTF-8是变长表示的,平均为3byte表示一个字符,而并不是一定用3byte。

    其实人家ORACLE没这么笨,本来就可以用字符为单位来定义varchar2的长度的,这个时候需要注意在建表时这样写:

 

create table ABC_TABLE (A_FIELD varchar2(20 char))

 

 

    这个varchar2(20 char)就表示了是用字符为单位来定义了,而默认情况下的varchar2(20)这样就是字节!

    如果你之前没考虑到这个问题,而现在遇到了,又想更改你的字段定义的话,可以这样写:

 

alter table ABC_TABLE modify (A_FIELD varchar2(20 char))

 

 

但是如果你不确定究竟是怎么定义的,或者,你想找出所有采用字节定义长度的字段,可以试试用这样的方法:

 

select * from user_tab_columns where CHAR_USED='B'

 这里的CHAR_USED的意思是:如果是字符定义-'C',字节定义-'B'

 

如果需要批量修改所有的以字节数定义的字符串长度,需要创建一个类似这样的存储过程:

 

create or replace procedure pro_fix_varchar as
cursor fieldList is
  select T1.TABLE_NAME,T1.COLUMN_NAME,T1.DATA_LENGTH from USER_TAB_COLUMNS T1
   left join user_tables T2 on T2.TABLE_NAME=T1.TABLE_NAME
   where T2.TABLE_NAME is not null
   and T2.TABLESPACE_NAME='MY_TABLESPACE' --请把这里修改为你自己的表空间名
   and CHAR_USED='B';
tblName varchar2(2000);
fieldName varchar2(2000);
dataLen varchar2(10);
sqlStr varchar2(2000);
cnt integer;
BEGIN
  dbms_output.put_line('begin');
  cnt:=0;
  open fieldList;
  loop
    fetch fieldList into tblName,fieldName,dataLen;
    exit when fieldList%notfound;
    sqlStr:='alter table "'||tblName||'" modify ("'||fieldName||'" varchar2('||dataLen||' char))';
    execute immediate sqlStr;
    commit;
    cnt:=cnt+1;
  end loop;
  close fieldList;
  dbms_output.put_line('fixed '||cnt||' field(s).');
end pro_fix_varchar;

 

然后调用这个存储过程:

 

call pro_fix_varchar();

 

即可

分享到:
评论

相关推荐

    oracle中varchar2(byte)和varchar2(char).doc

    oracle中varchar2(byte)和varchar2(char) 细节决定成败,大家在设计数据库建表的时候一定要注意。

    ORACLE中的数据类型.doc

    当你在oracle 中定义一个character 数据时,通常需要制定字段的长度,它是该字段的最大长度。ORACLE提供以下几种character 数据类型: CHAR() CHAR数据类型是一种有固定长度和最大长度的字符串。存储在数据类型为...

    GP数据库表结构转mysql库、oracle库 varchar类型字段长度批量处理excel_MYSQL_oracle_数据库

    oracle数据库表结构转gp数据库表结构、转mysql、数据库时表字段长度问题

    oracle字段类型小结

    oracle字段类型小结 CHAR固定长度字符串,最大长度2000,bytes VARCHAR2可变长度的字符串,最大长度4000,bytes,可做索引的最大长度749 NCHAR根据字符集而定的固定长度字符串,最大长度2000

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    Oracle接收长度大于4000的字符串

    Oracle接收长度大于4000的字符串 Oracle接收长度大于4000的字符串

    oracle char,varchar,varchar2的区别和使用方法

    oracle char,varchar,varchar2的区别和使用方法 非本人总结,但是说的挺好的! 欢迎下载

    浅析Oracle中char和varchar2的区别

    char是定长的 char(10) varchar2(10) 同样存 a ,char占用了10个字符,varchar2 只占用了 一个字符(一个中文占两个字符,英文占一个)。 但是char的查询速度要比varchar2快。varchar2,Oracle还要进行语法分析,这...

    Oracle的CLOB大数据字段类型操作方法

    一、Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。 在Oracle Database中,...

    Oracle 数据类型

    3、NCHAR和nvarchar2,NCHAR和CHAR区别在于NCHAR用来存储Unicode字符集类型,即双字节字符数据,CHAR是一个字节,而NCAHR是一个字符(两个字节),前者是CHAR(1)无法插入‘的’,后者是NCHAR(1)可以插入‘的’ ...

    函数进行BLOB转换Varchar2.txt

    Oracle SQL 函数进行BLOB转换Varchar2

    varchar日期字段分区demo

    Range分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段. 基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。varchar日期字段分区sql demo

    oracle函数大全.doc

    在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 SQL> select instr('oracle traning','ra',1,2) instring from ...

    用PHP操纵Oracle的LOB类型的数据

    用过Oracle的人都知道,Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串。VARCHAR2也是Oracle公司推荐使用的...这时候,你有两个选择,一是用多个VARCHAR2来表示,二是用LOB字段。这里我们来看看第二个办法。

    oracle通过1条语句插入多个值的方法示例

    今天在实践过程中遇到一个问题, 我想往数据库插入多条数据时,使用了如下语句: insert into 表1 (字段1,字段2) values (1,2),(2,3),(3,4); 这条语句在mysql中执行的话,语法一点毛病都没有,但是,在oracle上...

    MYSQL,SQLSERVER,ORACLE常用的函数

    在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 SQL> select instr('oracle traning','ra',1,2) instring ...

    Mysql中varchar长度设置方法

    主要介绍了Mysql中varchar长度设置方法的相关资料,本文还给大家带来了valar类型的变化及char()和varchar()的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Oracle数据库表中字段顺序的修改方法

    前段时间,有人问我, 有一个关于Oracle中表字段顺序调整的问题。问题就是当设计好表结构之后,后期如果需要往表中增加字段,默认会把该字段放到表的最后,并且字段特别多而我们又想把有关联性的字段放在一起,这时...

    oracle支持的数据类型

    常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 bytes ...char(n) n=1 to 2000字节 定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)

Global site tag (gtag.js) - Google Analytics