`
doingwell
  • 浏览: 34328 次
  • 性别: 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

    - **定义**: `VARCHAR2(n BYTE)`定义了一个变长的字符串字段,其中`n`代表该字段所能存储的最大字节数。 - **字符集敏感**: 字符集的选择会影响存储空间的计算。例如,在GBK编码下,一个汉字占用2个字节;而在UTF-8...

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

    在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...

    Oracle与DB2数据类型分类对应说明

    但是,Oracle 中的 VARCHAR2(n)类型仅用于存放较小的字符串,因此,在实际应用中,我们需要根据实际情况选择合适的字符串类型。例如,在 DB2/400 中,我们可以使用定长的 CHAR(N)类型与 Oracle 的 VARCHAR2(n)...

    PowerDesigner字段与Oracle字段对应

    在数据库设计过程中,PowerDesigner 和 Oracle 之间的字段对应关系是至关重要的,因为它直接影响到数据的存储和处理。PowerDesigner 是一款强大的数据建模工具,它允许用户创建概念数据模型(CDM)和物理数据模型...

    oracle中读取blob字段.doc

    这里定义了一个名为`BLOBTEST`的表,其中包含三个字段:主键`ID`、字符串类型的`NAME`以及BLOB类型的`PICTURE`。 #### 三、Java中读取BLOB字段 在Java应用程序中读取Oracle数据库中的BLOB字段通常涉及到几个步骤:...

    ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob).pdf

    这些字段类型各有其特性和用途,下面我们将详细探讨它们,并通过一个简单的示例来展示如何在Oracle数据库中对这些类型进行读写操作。 1. Long类型: Long数据类型用于存储大文本数据,它最多可以存储约2GB的数据。...

    oracle函数大全.doc

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

    深入浅析mybatis oracle BLOB类型字段保存与读取

    在这个例子中,`CLOB_COL_VALUE`是一个CLOB字段,而BLOB字段并未直接展示,但我们可以添加一个`BLOB`类型的字段来存储二进制数据。 接下来,我们来看如何使用Java和MyBatis进行操作。在MyBatis中,实体类`BlobField...

    Oracle向PostgreSQL移植实例

    - PostgreSQL中的字段长度定义只接受数字,不接受BYTE单位。 5. **序列**: - Oracle的序列在PostgreSQL中没有直接对应物,但可以通过创建序列和触发器来实现类似功能。 6. **索引与主键**: - Oracle的ALTER ...

    Oracle SQL基础培训

    - **VARCHAR2(size[BYTE|CHAR])**:变长的字符数据类型,最大长度为`size`字节或字符,默认和最小长度为1字节或字符,最大长度为4000字节。`BYTE`表示按照字节长度进行语义处理,而`CHAR`表示按照字符长度进行语义...

    如何处理错误ORA-29275:部分多字节字符

    1. **表中的VARCHAR2字段存储了多字节字符**:如果某个字段的数据类型为VARCHAR2,并且其长度限制不足以完全容纳某些多字节字符(例如汉字),则可能导致数据截断。当尝试查询这些被截断的多字节字符时,Oracle...

    jsp实现向oracle中blob字段上传附件

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而Oracle数据库是广泛应用的关系型数据库管理系统,支持多种数据类型,包括BLOB(Binary Large Object),用于存储大块二进制数据,如图片...

    [整理版]oracle数据类型及存储方式.doc

    6. **ROWID**: ROWID 是一个特殊的类型,用于唯一标识表中的每一行,便于快速访问数据。 在设计数据库时,正确选择数据类型至关重要,因为它直接影响到数据的存储效率、查询性能以及数据的一致性和完整性。Oracle ...

    ORACLE数据库汉字占几个字节问题.pdf

    在 ORACLE 数据库中,汉字占用的字节数是一个常见的问题。根据数据库的字符集编码,一个汉字可以占用不同的字节数。在 AL32UTF8 或 UTF8 编码下,一个汉字通常占用 3 到 4 个字节,而在 ZHS16GBK 编码下,一个汉字...

    INFORMIX迁移到ORACLE

    5. **大数据字段**:Informix的byte类型对应Oracle的BLOB,lvarchar类型对应Oracle的VARCHAR或CLOB。根据数据长度选择合适类型,注意Oracle的VARCHAR最大长度为4000。 6. **数字类型长度**:Oracle对数字类型的精度...

    Oracle迁移到PG建议.docx

    * Varchar2和VarChar:在Oracle中,Varchar2是变长字符串,而在Postgresql中,VarChar是固定长度字符串。 * DATE、TIME、TIMESTAMP:在Oracle中,DATE、TIME、TIMESTAMP是不同的数据类型,而在Postgresql中,只有一...

Global site tag (gtag.js) - Google Analytics