
区别:
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的,
比如,存储字符串“abc",对于CHAR
(10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2
(10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
CHAR的长度是固定的 而VARCHAR 的长度是可以变化的 比如 存储字符串“abc" 对于CHAR ( ) 表示你存储的字符将占 个字节(包括 个空字符) 在数据库中它是以空格占位的 而同样的VARCHAR ( )则只占用 个字节的长度 只是最大值 当你存储的字符小于 时 按实际长度存储
CHAR的效率比VARCHAR 的效率稍高 看来cscm_number应该设成 char( )
目前VARCHAR是VARCHAR 的同义词 工业标准的VARCHAR类型可以存储空字符串 但是Oracle不这样做 尽管它保留以后这样做的权利 Oracle自己开发了一个数据类型VARCHAR 这个类型不是一个标准的VARCHAR 它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值 假如你想有向后兼容的能力 Oracle建议使用VARCHAR 而不是VARCHAR
何时该用CHAR 何时该用varchar
CHAR与VARCHAR 是一对矛盾的统一体 两者是互补的关系 VARCHAR 比CHAR节省空间 在效率上比CHAR会稍微差一些 即要想获得效率 就必须牺牲一定的空间 这也就是我们在数据库设计上常说的‘以空间换效率’ VARCHAR 虽然比CHAR节省空间 但是假如一个VARCHAR 列经常被修改 而且每次被修改的数据的长度不同 这会引起‘行迁移’(Row Migration)现象 而这造成多余的I/O 是数据库设计和调整中要尽力避免的 在这种情况下用CHAR代替VARCHAR 会更好一些
关于char和varchar 的比较
char类型与char型或字符常量的比较 在比较时使用补齐空格的方式进行比较
varchar 类型与varchar 类型 char型和字符常量的比较 在比较时不补充空格 直接比较
create table tt(A CHAR( ) A VARCHAR ( )) ;
INSERT INTO TT VALUES( A A ) ;
insert into tt values( A A ) ;
MIT ;
CHAR型与字符常量的比较 字符常量作为char型处理
与 A 比较 返回 行 也就是在比较时自动将常量 A 右补齐空格后比较
select from tt where a = A ;
A A
A A
A A
与 A 比较 返回 行 也就是在比较时自动将常量 A 右补齐空格后比较
select from tt where a = A ;
A A
A A
A A
VARCHAR 与常量的比较 字符常量作为varchar 型处理
与 A 比较 返回 行 也就是在比较时对 A 不做处理 直接比较
select from TT WHERE A = A ;
A A
A A
与 A 比较 返回 行 也就是在比较时对 A 不做处理 直接比较
select from TT WHERE A = A ;
A A
A A
当CHAR类型和VARCHAR 类型比较时 比较时对字段值是不作处理 直接比较的
让A 和A 直接比较 此时是直接比较 有一条记录的A 和A 相同
select from tt where a =a ;
A A
A A
但是当和decode函数配合使用时 出现不同的情况
使用A 字段
select decode(a A AAAA BBBB ) FROM TT ;
DECODE(A A AAAA BBBB )
BBBB
BBBB
虽然A 字段为char( ) 但是比较时并没有将常量 A 补空格再与字段A 做比较 而是直接进行比较 也就是将两个比较字段按照varchar 类型处理的
因此比较时认为字段A 不等于常量 A 出现两条结果为 BBB 的记录
进一步验证
select decode(a A AAAA BBBB ) FROM TT ; 此处是两个空格
DECODE(A A AAAA BBBB )
BBBB
BBBB
还是返回两条 BBB 的记录 说明比较的不是按照char型的比较规则处理的
使用A 字段
select decode(a A AAAA BBBB ) FROM TT ;
DECODE(A A AAAA BBBB )
AAAA
BBBB
此时是正常的VARCHAR 类型之间的比较 第一条记录的A 字段等于 A 返回 AAA 第二行记录的A 字段为’A 比较时不等 返回 BBB
当使用case表达式处理A 字段时 出现了与decode函数不同的处理结果
使用字段A
select case a when A then AAA else BBB end from tt ;
CASEA WHEN A THEN AAA ELSE BBB
AAA
AAA
在使用case语句中使用A 字段与常量 A 比较时 两个比较值按照char型的比较规则处理 在右补空格之后进行比较 因此返回两条记录
进一步验证 如下
select case a when A then AAA else BBB end from tt ;
CASEA WHEN A THEN AAA ELSE BBB
AAA
AAA
此时将常量改为 A 比较时仍视为char类型之间的比较 将字段A 补齐空格后与常量比较
使用A 字段
select case a when A then AAA else BBB end from tt ;
CASEA WHEN A THEN AAA ELSE BBB
AAA
BBB
此时是正常的VARCHAR 类型之间的比较 第一条记录的A 字段等于 A 返回 AAA 第二行记录的A 字段为’A 比较时不等 返回 BBB
总结
在使用decode函数对char字段做比较时 需要注意即使比较的两个字段都是char类型 但是decode函数是将其转化varchar 类型 进行处理 不遵循char型的比较规则
对于char数据 在集合 *** 作中 按照char的实际数据进行比较 而不是按照char型数据的比较规则进行的
下面是一个简单例子
create table t (name char( )) ;
create table t (name char( )) ;
begin
for i in loop
insert into t values(to_char(i)) ;
insert into t values(to_char(i)) ;
end loop ;
mit;
end ;
select name from t minus select name from t ;
NAME
如果按照char型的比较规则 则不应该有返回值
select anem from t intersect select name from t ;
NAME
无返回值 也说明集合 *** 作时比较没有按照char型的比较规则
===============================评论 ============================
对于decode和case对于char类型的差别 原因是由于case是表达式 而decode是函数
函数中输入参数和返回值一般都定义为varchar 类型
多谢指点 一时没有想到这里 看了一下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) VARCHAR
EXPR NUMBER IN
PAT NUMBER IN
RES VARCHAR IN
(RESULT) DATE
EXPR NUMBER IN
PAT NUMBER IN
RES DATE IN
(RESULT) NUMBER
EXPR VARCHAR IN
PAT VARCHAR IN
RES NUMBER IN
(RESULT) VARCHAR
EXPR VARCHAR IN
PAT VARCHAR IN
RES VARCHAR IN
(RESULT) DATE
EXPR VARCHAR IN
PAT VARCHAR IN
RES DATE IN
(RESULT) NUMBER
EXPR DATE IN
PAT DATE IN
RES NUMBER IN
(RESULT) VARCHAR
EXPR DATE IN
PAT DATE IN
RES VARCHAR IN
(RESULT) DATE
EXPR DATE IN
PAT DATE IN
RES DATE IN
(RESULT) SYS STANDARD
EXPR SYS STANDARD IN
PAT SYS STANDARD IN
RES SYS STANDARD IN
(RESULT) SYS STANDARD
EXPR SYS STANDARD IN
PAT SYS STANDARD IN
lishixinzhi/Article/program/Oracle/201311/19034
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索 *** 作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
在MySQL中用来判断是否需要进行对据列类型转换的规则
1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.
例外:长度小于4个字符的char数据列不会被转换为varchar类型
char和varchar的区别如下:
1、最大长度:char最大长度是255字符,varchar最大长度是65535个字节。
2、定长:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。
3、空间使用:char会浪费空间,varchar会更加节省空间。
4、查找效率:char查找效率会很高,varchar查找效率会更低。
5、尾部空格:char插入时可省略,vaechar插入时不会省略,查找时省略。
char和varchar的区别
char和varchar是mysql中的两个相似的列,都可以存储字符和字符串。但是char存储的列的长度是不可变的,varchar存储的列的长度是可变的。
例如:插入char(5)的列表示这个列占用的存储空间一直是5个字符大小。但是在存储数据是往往不会满足5个字符,可能会比5少,也可能会多。比如我们
插入“abc”时,很显然“abc”是3个字符,此时MySql底层会将“abc”后面追加两个空格字符为“abc ”。检索时,MySql会自动帮你做一次trim() *** 作,去掉最后的空格,然后返回“abc”。
1、处理速度
char 和相同长度的varchar处理速度差不多。varchar的长度不会影响处理速度;
2、string
O/R Mapping中对应实体的属性类型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性来说,可变长度的类型更加吻合;varchar的存放和string是一样原理的,即length {block}这种方式,所以varchar的长度和它实际占用空间是无关的;
3、查询成本
char和varchar的比较成本是一样的,现在关键就看它们的索引查找的成本了,因为查找策略都一样,因此应该比较谁占用空间小。
例:
在存放相同数量的字符情况下,如果数量小,那么char占用长度是小于varchar的,但如果数量稍大,则varchar完全可能小于char,而且要看实际填充数值的充实度,比如说varchar(3)和char(3),那么理论上应该是char快了,但如果是char(10)和varchar(10),充实度只有30%的情况下,理论上就应该是varchar快了。
因为varchar需要额外空间存放块长度,所以只要length(1-fillfactor)大于这个存放空间(好像是2字节),那么它就会比相同长度的char快了。
扩展资料:
1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char;
2、能确定长度又不一定是ansi字符或者,那么用nchar;
3、不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400;
4、不查询的话没什么好说的,用nvarchar(4000);
5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度为X位的数据。
以上就是关于数据库varchar和char的区别全部的内容,包括:数据库varchar和char的区别、Oracle中的Char与Varchar的区别和实例、mysql中char和varchar有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)