1.

CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR

(20),表示你存储的字符将占20个字节(包括17个空字符),在数据库中它是以空格占位的,而同样的VARCHAR2

(20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。

2.CHAR的效率比VARCHAR2的效率稍高。看来cscm_number应该设成

char(19)

3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是Oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。假如你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。

何时该用CHAR,何时该用varchar2?

CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.

VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。

VARCHAR2虽然比CHAR节省空间,但是假如一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row

Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

----以上内容由 华夏名网 搜集整理,如转载请注明原文出处,并保留这一部分内容。

关于char和varchar2的比较的问题

关于char和varchar2的比较

char类型与char型或字符常量的比较,在比较时使用补齐空格的方式进行比较。varchar2类型与varchar2类型,char型和字符常量的比较,在比较时不补充空格,直接比较。create table tt(A1 CHAR(2) , A2 VARCHAR2(2)) ;

INSERT INTO TT VALUES('A','A') ;

insert into tt values('A','A ') ;

COMMIT ;

--CHAR型与字符常量的比较,字符常量作为char型处理

--与'A'比较,返回2行,也就是在比较时自动将常量'A'右补齐空格后比较

select * from tt where a1='A' ;

A1 A2

-- --

A A

A A

--与'A '比较,返回2行,也就是在比较时自动将常量'A'右补齐空格后比较

select * from tt where a1='A ' ;

A1 A2

-- --

A A

A A

--VARCHAR2与常量的比较,字符常量作为varchar2型处理--与'A'比较,返回1行,也就是在比较时对'A'不做处理,直接比较

select * from TT WHERE A2='A';

A1 A2

-- --

A A

--与'A '比较,返回1行,也就是在比较时对'A'不做处理,直接比较

select * from TT WHERE A2='A ';

A1 A2

-- --

A A

--当CHAR类型和VARCHAR2类型比较时,比较时对字段值是不作处理,直接比较的--让A1和A2直接比较,此时是直接比较,有一条记录的A1和A2相同

select * from tt where a1=a2 ;

A1 A2

-- --

A A

但是当和decode函数配合使用时,出现不同的情况

使用A1字段

select decode(a1,'A','AAAA','BBBB') FROM TT

;

DECODE(A1,'A','AAAA','BBBB')

----------------------------

BBBB

BBBB

虽然A1字段为char(2),但是比较时并没有将常量'A'补空格再与字段A1做比较,而是直接进行比较,也就是将两个比较字段按照varchar2类型处理的因此比较时认为字段A1不等于常量'A',出现两条结果为'BBB'的记录。

进一步验证,

select decode(a1,'A ','AAAA','BBBB') FROM TT ; --此处是两个空格

DECODE(A1,'A','AAAA','BBBB')

----------------------------

BBBB

BBBB

还是返回两条'BBB'的记录,说明比较的不是按照char型的比较规则处理的。

使用A2字段

select decode(a2,'A','AAAA','BBBB') FROM TT

;

DECODE(A2,'A','AAAA','BBBB')

----------------------------

AAAA

BBBB

此时是正常的VARCHAR2类型之间的比较,第一条记录的A2字段等于'A',返回'AAA',第二行记录的A2字段为’A

',比较时不等,返回'BBB'

当使用case表达式处理A1字段时,出现了与decode函数不同的处理结果

使用字段A1

select case a1 when 'A' then 'AAA' else 'BBB' end

from tt ;

CASEA1WHEN'A'THEN'AAA'ELSE'BBB

------------------------------

AAA

AAA

在使用case语句中使用A1字段与常量'A'比较时,两个比较值按照char型的比较规则处理,在右补空格之后进行比较,因此返回两条记录

进一步验证,如下,

select case a1 when

'A ' then 'AAA' else 'BBB' end

from tt ;

CASEA1WHEN'A'THEN'AAA'ELSE'BBB

------------------------------

AAA

AAA

此时将常量改为'A ',比较时仍视为char类型之间的比较,将字段A1补齐空格后与常量比较。

使用A2字段

select case a2 when 'A' then 'AAA' else 'BBB' end

from tt ;

CASEA2WHEN'A'THEN'AAA'ELSE'BBB

------------------------------

AAA

BBB

此时是正常的VARCHAR2类型之间的比较,第一条记录的A2字段等于'A',返回'AAA',第二行记录的A2字段为’A

',比较时不等,返回'BBB'

总结,

在使用decode函数对char字段做比较时,需要注意即使比较的两个字段都是char类型,但是decode函数是将其转化varchar2类型

进行处理,不遵循char型的比较规则

===============================评论1============================

这几天频繁遇到char型数据比较的问题,总结如下:

对于char数据,在集合操作中,按照char的实际数据进行比较,而不是按照char型数据的比较规则进行的。

下面是一个简单例子

create table t1(name char(10)) ;

create table t2(name char(20)) ;

begin

for i in 1..5 loop

insert into t1 values(to_char(i)) ;

insert into t1 values(to_char(i)) ;

end loop ;

commit;

end ;

select name from t1 minus select name from t2 ;

NAME

--------------------

1

2

3

4

5

如果按照char型的比较规则,则不应该有返回值。

select anem from t1 intersect select name from t2 ;

NAME

--------------------

无返回值,也说明集合操作时比较没有按照char型的比较规则。

===============================评论2============================

对于decode和case对于char类型的差别,原因是由于case是表达式,而decode是函数。

函数中输入参数和返回值一般都定义为varchar2类型。

多谢指点,一时没有想到这里,看了一下decode函数的定义,如你所述,在使用decode的函数对char型数据进行类型转换。

下面是decode的函数的参数定义。

SQL> desc

sys.standard.decode

Parameter

Type Mode Default?

--------- ----------------------- ---- --------

(RESULT) NUMBER EXPR NUMBER IN PAT NUMBER IN RES NUMBER IN(RESULT) VARCHAR2 EXPR NUMBER IN PAT NUMBER IN RES VARCHAR2 IN (RESULT) DATE EXPR NUMBER IN PAT NUMBER IN RES DATE IN(RESULT) NUMBER EXPR VARCHAR2 IN PAT VARCHAR2 IN RES NUMBER IN(RESULT) VARCHAR2

EXPR VARCHAR2 IN

PAT VARCHAR2 IN RES VARCHAR2 IN (RESULT) DATE EXPR VARCHAR2 IN PAT VARCHAR2 IN RES DATE IN(RESULT) NUMBER EXPR DATE IN PAT DATE IN RES NUMBER IN (RESULT) VARCHAR2 EXPR

oracle中的char和j,oracle中char与varchar2的区别相关推荐

  1. Oracle中NVARCHAR2与VARCHAR2的区别

    Oralce官方文档"Datatypes"部分对NVARCHAR2.VARCHAR2以及VARCHAR有一段描述,可以清晰得到它们的区别.罗列在此,供大家参考. [链接]http: ...

  2. 【转】mysql 、oracle中char和varchar以及varchar2的区别

    mysql char是固定长度,varchar是可变长度的,varchar2是oracle特有的. char定长存储,速度快,但是存在一定空间的资源浪费,适用于存储字段不是很大.对速度要求高的场合.速 ...

  3. Oracle中 char varchar varchar2的区别

    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串"abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的 ...

  4. 达梦数据库迁移oracle数据乱码,oracle迁移到达梦数据库之存储过程中char类型的不同处理...

    oracle迁移到dm之存储过程中char类型的不同处理 1.问题描述: oracle迁移到dm后,oracle正常使用的存储过程,在dm中使用报错:字符串截断 2.查找原因: 2.1 对比oracl ...

  5. oracle中char,varchar,varchar2的区别

    1.char长度固定,varchar2长度可变.例如,存储字符串"123",char(10)表示存储的内容占10个字节:123      (包含7个空格),varchar2(20) ...

  6. oracle中lang能不能查找,oracle中的查询语句

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  7. oracle怎么声明nvl函数,[转载]Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  8. oracle外部表ora29913,从外部表中选择sqlplus错误:ORA-29913:执行ODCIEXTTABLEOPEN标注时出错...

    我已经建立了一个简单的Oracle外部表测试,我(与DBA和Unix管理员一起)无法工作. 以下内容基于Oracle的External Tables Concepts.我们使用的数据库是11g. 这是 ...

  9. oracle查看物化视图的索引,oracle – 物化视图中的域索引返回零行

    我有Oracle DB的问题 – 在物化视图上通过CONTAINS()搜索后,域索引返回零行.我看到物化视图充满了数据,我还使用过程ctx_ddl.sync_index()进行域索引同步. 什么有用: ...

最新文章

  1. Java 中这些常用关键字,总有那么些被你遗忘的
  2. JavaScript学习05 定时器
  3. 用正则实现多行文本合并,从而保存为csv文件
  4. python中id函数的用法_用id函数做几个测试
  5. php 判断分辨率做判断,PHP判断是否是成人照片或者裸照:基于皮肤像素点来检测图片裸照的类文件...
  6. 一个域名值百万, 现在不注册,未来价更高
  7. 3800元!爆料大神怒赞谷歌Pixel 6:这是今年最好看手机!
  8. matlab path路径定义文件,MATLAB基本操作(七):有关文件路径的几个函数在编程中的作用...
  9. 结合使用 Hadoop 和 Couchbase
  10. Cisco设备基础命令
  11. 中兴笔试c语言,中兴面试C语言题1
  12. 如何在Win10中运行Win7小游戏 扫雷,蜘蛛纸牌,红心大战,纸牌,空当接龙?
  13. android 滴滴司机接单滑动按钮,滴滴车主怎么设置手动接单 自动接单关闭步骤
  14. mui中双webView的刷新
  15. 出租房安装监控摄像头的必要性
  16. dfuse 开放其 EOSIO 堆栈的源代码
  17. 《数据挖掘》学习框架
  18. 高薪程序员面试题精讲系列23之说一下如何实现文件上传、下载以及断点续传?
  19. opencv通过dll调用matlab函数,图片作为参数
  20. 正确使用#include和前置声明(forward declaration)

热门文章

  1. java线程之InheritableThreadLocal
  2. 第九届蓝桥杯java B组—第二题方格计数(详细介绍)
  3. 商品和服务税收分类编码表_如何设置客户编码和商品编码?(附操作图)
  4. python打开中文文本utf-8用不了_关于Python文档读取UTF-8编码文件问题
  5. jmeter 自定义参数_jmeter参数化并在jenkins上执行
  6. 13张图看懂综合类数据中心机房建设标准!
  7. java comparable排序_Java使用Comparable解决排序问题
  8. left join 不重复_R语言ETL工程:连接(join)
  9. ML:MLOps系列讲解之《基于ML的软件的三个层次之03 Code: Deployment Pipelines》解读
  10. 成功解决:连接sql server时插入数据库内容为乱码,并且输出也为乱码