很多新手在建数据库或添加表、字段时,会这样忽略一个问题: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();
即可
相关推荐
- **定义**: `VARCHAR2(n BYTE)`定义了一个变长的字符串字段,其中`n`代表该字段所能存储的最大字节数。 - **字符集敏感**: 字符集的选择会影响存储空间的计算。例如,在GBK编码下,一个汉字占用2个字节;而在UTF-8...
在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...
但是,Oracle 中的 VARCHAR2(n)类型仅用于存放较小的字符串,因此,在实际应用中,我们需要根据实际情况选择合适的字符串类型。例如,在 DB2/400 中,我们可以使用定长的 CHAR(N)类型与 Oracle 的 VARCHAR2(n)...
在数据库设计过程中,PowerDesigner 和 Oracle 之间的字段对应关系是至关重要的,因为它直接影响到数据的存储和处理。PowerDesigner 是一款强大的数据建模工具,它允许用户创建概念数据模型(CDM)和物理数据模型...
这里定义了一个名为`BLOBTEST`的表,其中包含三个字段:主键`ID`、字符串类型的`NAME`以及BLOB类型的`PICTURE`。 #### 三、Java中读取BLOB字段 在Java应用程序中读取Oracle数据库中的BLOB字段通常涉及到几个步骤:...
这些字段类型各有其特性和用途,下面我们将详细探讨它们,并通过一个简单的示例来展示如何在Oracle数据库中对这些类型进行读写操作。 1. Long类型: Long数据类型用于存储大文本数据,它最多可以存储约2GB的数据。...
在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 SQL> select instr('oracle traning','ra',1,2) instring from ...
在这个例子中,`CLOB_COL_VALUE`是一个CLOB字段,而BLOB字段并未直接展示,但我们可以添加一个`BLOB`类型的字段来存储二进制数据。 接下来,我们来看如何使用Java和MyBatis进行操作。在MyBatis中,实体类`BlobField...
例如,定义一个`CHAR(10)`列,即使只存了一个字符,也会在内存中占满10个字符的空间,剩余部分用空格填充。 #### §1.2 VARCHAR2 `VARCHAR2`是可变长度的字符串类型,仅存储实际输入的字符数量,比`CHAR`更节省...
在Oracle中,数据类型是定义数据库中字段或变量所能存储的数据种类的关键元素,而存储方式则关乎如何在磁盘上保存这些数据以及如何优化空间利用率。以下是对Oracle数据类型及存储方式的深入探讨。 ### 第一部分:...
- PostgreSQL中的字段长度定义只接受数字,不接受BYTE单位。 5. **序列**: - Oracle的序列在PostgreSQL中没有直接对应物,但可以通过创建序列和触发器来实现类似功能。 6. **索引与主键**: - Oracle的ALTER ...
- **VARCHAR2(size[BYTE|CHAR])**:变长的字符数据类型,最大长度为`size`字节或字符,默认和最小长度为1字节或字符,最大长度为4000字节。`BYTE`表示按照字节长度进行语义处理,而`CHAR`表示按照字符长度进行语义...
1. **表中的VARCHAR2字段存储了多字节字符**:如果某个字段的数据类型为VARCHAR2,并且其长度限制不足以完全容纳某些多字节字符(例如汉字),则可能导致数据截断。当尝试查询这些被截断的多字节字符时,Oracle...
在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而Oracle数据库是广泛应用的关系型数据库管理系统,支持多种数据类型,包括BLOB(Binary Large Object),用于存储大块二进制数据,如图片...
6. **ROWID**: ROWID 是一个特殊的类型,用于唯一标识表中的每一行,便于快速访问数据。 在设计数据库时,正确选择数据类型至关重要,因为它直接影响到数据的存储效率、查询性能以及数据的一致性和完整性。Oracle ...
在 ORACLE 数据库中,汉字占用的字节数是一个常见的问题。根据数据库的字符集编码,一个汉字可以占用不同的字节数。在 AL32UTF8 或 UTF8 编码下,一个汉字通常占用 3 到 4 个字节,而在 ZHS16GBK 编码下,一个汉字...
5. **大数据字段**:Informix的byte类型对应Oracle的BLOB,lvarchar类型对应Oracle的VARCHAR或CLOB。根据数据长度选择合适类型,注意Oracle的VARCHAR最大长度为4000。 6. **数字类型长度**:Oracle对数字类型的精度...
* Varchar2和VarChar:在Oracle中,Varchar2是变长字符串,而在Postgresql中,VarChar是固定长度字符串。 * DATE、TIME、TIMESTAMP:在Oracle中,DATE、TIME、TIMESTAMP是不同的数据类型,而在Postgresql中,只有一...