何时该用CHAR,何时该用varchar2?
CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.
VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移 ’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。
这几天在做测试的时候发现一个异常:java.sql.SQLException: ORA-01401: inserted value too large for column。显然是插入的中文字符过长了。要插入的这个字段是varchar2类型的, oracle中varchar2最大是4000字节,按道理4000个字节可以插入2000个汉字的。有点迷惑。。。
首先在一台win xp的数据库服务器上实验:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
SQL>
SQL> create table t ( c varchar2(4000));
表以创建.
SQL> insert into t values ('测试');
已创建1行。
SQL> commit;
--前面已经插入了2个汉字,这次再增加999*2个汉字。
SQL> begin
2 for i in 1..999 loop
3 update t set c=c||'测试';
4 commit;
5 end loop;
6 end;
7 /
PL/SQL 过程已成功完成。
SQL> select length(c) from t;
LENGTH(C)
----------
2000
SQL> select lengthb(c) from t ;
LENGTHB(C)
----------
4000
显然插入2000个汉字成功了
然后在另一台linux机器上实验:
sql->select * from V$version;
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL>
SQL> create table t ( c varchar2(4000));
表以创建.
SQL> insert into t values ('测试');
已创建1行。
SQL> commit;
然后:
begin
for i in 1..999 loop
update t set c=c||'测试';
commit;
end loop;
end;
------------------------
begin
*
ERROR 位于第 1 行:
ORA-01489: result of string concatenation is too long
ORA-06512: at line 3
---------------------------
显然是太长了。。。
sql->select length(c) from t;
LENGTH(C)
----------
1332
已选择 1 行。
sql->select lengthb(c) from t;
LENGTHB(C)
----------
3996
已选择 1 行。
--------------
不清楚linux那台机器字符集是不是utf-8编码,如果是,那么上面的结果正常。utf-8中汉字是占3字节的。
具体为什么会这样,那位达人可以告诉我?
另外:length 与 lengthb 的区别,
length求得是字符长度,
lengthb求得是字节长度。
...
....
...
....
分享到:
相关推荐
### Oracle中的VARCHAR2(BYTE)与VARCHAR2(CHAR)区别详解 #### 一、引言 在Oracle数据库中,`VARCHAR2`是最常用的字符数据类型之一,用于存储变长的字符串。然而,在定义`VARCHAR2`类型时,可以选择指定长度为`BYTE`...
### Oracle CHAR, VARCHAR, VARCHAR2 的区别与使用方法 在 Oracle 数据库中,字符串类型是极为常见的数据类型之一,主要用于存储文本数据。其中最常用的三种类型包括:`CHAR`, `VARCHAR`, 和 `VARCHAR2`。这三种...
Oracle 中 char 和 varchar2 的区别 Oracle 中 char 和 varchar2 是两种常用的字符串数据类型,它们之间的区别是很多开发者经常忽视的。下面我们将详细分析 Oracle 中 char 和 varchar2 的区别。 首先,char 是定...
总的来说,虽然`VARCHAR`和`VARCHAR2`在名称上有一定的相似性,但在实际应用中,`VARCHAR2`因其更长的最大长度、更好的空格处理机制以及更高的兼容性,在Oracle数据库中得到了更广泛的应用。理解这些细微的区别,...
对于Oracle中的VARCHAR2类型,可以根据实际需求选择与DB2/400中的CHAR或VARCHAR类型对应。特别是当VARCHAR2类型的长度小于等于32766时,建议使用DB2/400中的CHAR类型以提高效率并节省存储空间。 #### 五、大对象...
Oracle SQL 函数进行BLOB转换Varchar2
例如,`varchar2`的最大长度通常小于`varchar`,并且Oracle对`varchar2`的数据进行了更严格的校验,这有助于减少因数据格式错误引发的问题。此外,Oracle建议优先使用`varchar2`,因为它在内部处理上更为高效。 **...
- Oracle Varchar2 类型可以映射为.NET中的 `String` 类型。 #### 四、版权及许可条款 Oracle Database Express Edition 2Day Plus .NET Developer Guide 的发布受到严格的版权保护,并且遵循Oracle的许可协议。...
在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...
但是,Oracle 中的 VARCHAR2(n)类型仅用于存放较小的字符串,因此,在实际应用中,我们需要根据实际情况选择合适的字符串类型。例如,在 DB2/400 中,我们可以使用定长的 CHAR(N)类型与 Oracle 的 VARCHAR2(n)...
2. varchar 转 date 使用 to_date 函数可以将 varchar 类型转换为 date 类型。例如: ```sql select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual; ``` 这将字符串形式的日期和时间转换为 ...
例如,如果源Oracle表的一个varchar2字段长度超过MySQL的限制,那么在转换过程中可能需要截断或重新设计数据模型。 描述中提到了“转mysql、数据库时表字段长度问题”,这暗示了在迁移过程中可能会遇到兼容性问题。...
本文主要探讨的是两种常见字符串类型:`CHAR`和`VARCHAR2`,它们在使用上有何不同,并且会涉及一些相关的Oracle数据库功能。 首先,`CHAR`是定长字符串类型,这意味着当你声明一个`CHAR(10)`字段时,无论你存储的...
是处理wm_concat中以varchar处理合并列字段过小。 clob 可以加大处理。 oracle 9I oracle 10G 必备
### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...
Oracle中的VARCHAR2类型可以对应DB2/400中的CHAR类型和VARCHAR类型。当n时,可以使用DB2/400中的CHAR类型或VARCHAR类型。当n>4000时,可以使用DB2/400中的VARCHARLONG类型或CLOB类型。 三、NUMBER类型 Oracle中的...
create or replace procedure test_msg(i_user in varchar2, o_msg out varchar2) is begin o_msg := i_user ||', Good Morning!'; end; 然后,开始在Python命令行中进行存储过程调用。 import cx_Oracle as cx ...
AccountInfo VarChar2(1000), TransferMethod Char(1), --A: ASCII, E: EBCDIC, I: IMAGE TransferOption Char(1), LocalDirectory VarChar2(30), LastReply VarChar2(32767 ) ); ...
Oracle 中的 VARCHAR2(n) 类型可以对应 DB2 的 CHAR(n) 和 VARCHAR(n) 类型。其中,n 代表字符的长度。对于 VARCHAR2(n) 类型,如果 n ,则使用 DB2 的 CHAR 类型或 VARCHAR 类型;如果 n > 32766,则使用 DB2 的 ...