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

Oracle varchar2

阅读更多
何时该用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).doc

    ### Oracle中的VARCHAR2(BYTE)与VARCHAR2(CHAR)区别详解 #### 一、引言 在Oracle数据库中,`VARCHAR2`是最常用的字符数据类型之一,用于存储变长的字符串。然而,在定义`VARCHAR2`类型时,可以选择指定长度为`BYTE`...

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

    ### Oracle CHAR, VARCHAR, VARCHAR2 的区别与使用方法 在 Oracle 数据库中,字符串类型是极为常见的数据类型之一,主要用于存储文本数据。其中最常用的三种类型包括:`CHAR`, `VARCHAR`, 和 `VARCHAR2`。这三种...

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

    Oracle 中 char 和 varchar2 的区别 Oracle 中 char 和 varchar2 是两种常用的字符串数据类型,它们之间的区别是很多开发者经常忽视的。下面我们将详细分析 Oracle 中 char 和 varchar2 的区别。 首先,char 是定...

    varchar 和varchar2之间的联系和区别

    总的来说,虽然`VARCHAR`和`VARCHAR2`在名称上有一定的相似性,但在实际应用中,`VARCHAR2`因其更长的最大长度、更好的空格处理机制以及更高的兼容性,在Oracle数据库中得到了更广泛的应用。理解这些细微的区别,...

    Oracle和DB2的数据类型比较

    对于Oracle中的VARCHAR2类型,可以根据实际需求选择与DB2/400中的CHAR或VARCHAR类型对应。特别是当VARCHAR2类型的长度小于等于32766时,建议使用DB2/400中的CHAR类型以提高效率并节省存储空间。 #### 五、大对象...

    函数进行BLOB转换Varchar2.txt

    Oracle SQL 函数进行BLOB转换Varchar2

    char,varchar以及varchar2的区别

    例如,`varchar2`的最大长度通常小于`varchar`,并且Oracle对`varchar2`的数据进行了更严格的校验,这有助于减少因数据格式错误引发的问题。此外,Oracle建议优先使用`varchar2`,因为它在内部处理上更为高效。 **...

    oracle编程

    - Oracle Varchar2 类型可以映射为.NET中的 `String` 类型。 #### 四、版权及许可条款 Oracle Database Express Edition 2Day Plus .NET Developer Guide 的发布受到严格的版权保护,并且遵循Oracle的许可协议。...

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

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

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

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

    oracle中varchar与date的转换,number与varchar的转换.pdf

    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; ``` 这将字符串形式的日期和时间转换为 ...

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

    例如,如果源Oracle表的一个varchar2字段长度超过MySQL的限制,那么在转换过程中可能需要截断或重新设计数据模型。 描述中提到了“转mysql、数据库时表字段长度问题”,这暗示了在迁移过程中可能会遇到兼容性问题。...

    浅析Oracle中char和varchar2的区别

    本文主要探讨的是两种常见字符串类型:`CHAR`和`VARCHAR2`,它们在使用上有何不同,并且会涉及一些相关的Oracle数据库功能。 首先,`CHAR`是定长字符串类型,这意味着当你声明一个`CHAR(10)`字段时,无论你存储的...

    oracle替换wm_concat varchar处理为clob处理的方法

    是处理wm_concat中以varchar处理合并列字段过小。 clob 可以加大处理。 oracle 9I oracle 10G 必备

    oracle和db2的区别

    ### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...

    Oracle与DB2数据类型的对应说明书

    Oracle中的VARCHAR2类型可以对应DB2/400中的CHAR类型和VARCHAR类型。当n时,可以使用DB2/400中的CHAR类型或VARCHAR类型。当n>4000时,可以使用DB2/400中的VARCHARLONG类型或CLOB类型。 三、NUMBER类型 Oracle中的...

    Python使用cx_Oracle调用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 ...

    Oracle P/L SQL实现FTP上传、下载功能

    AccountInfo VarChar2(1000), TransferMethod Char(1), --A: ASCII, E: EBCDIC, I: IMAGE TransferOption Char(1), LocalDirectory VarChar2(30), LastReply VarChar2(32767 ) ); ...

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

    Oracle 中的 VARCHAR2(n) 类型可以对应 DB2 的 CHAR(n) 和 VARCHAR(n) 类型。其中,n 代表字符的长度。对于 VARCHAR2(n) 类型,如果 n ,则使用 DB2 的 CHAR 类型或 VARCHAR 类型;如果 n > 32766,则使用 DB2 的 ...

Global site tag (gtag.js) - Google Analytics