很多新手在建数据库或添加表、字段时,会这样忽略一个问题: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`更节省...
- 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中,只有一...