12
返回列表 发新帖
楼主: fan_zhen_hua

[讨论] 关于char和varchar2

[复制链接]
招聘 : Java研发
论坛徽章:
4
设计板块每日发贴之星
日期:2007-09-08 01:05:20设计板块每日发贴之星
日期:2008-09-18 01:02:45设计板块每日发贴之星
日期:2009-06-10 01:01:03ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
11#
发表于 2009-11-10 13:56 | 只看该作者
原帖由 fan_zhen_hua 于 2009-11-5 14:21 发表
如题,有两个问题比较怀疑
1.char会比varchar2效率高吗??看tom的编程艺术,说到char实际上是伪装的varchar2,存储结构也是一样的。所以我认为char(1)和varchar2(1)的效率是一样的。

tom在书上写到,任何情况下,都应该使用varchar2,即使是char(1),单字符字段,也不建议使用char


2.另外,如果一个字段,其实只要varchar2(100),你硬是给分配了varchar2(1000),这个会产生什么影响??


以前我也问过这样的问题,首先你应该去 google一下。。然后再来问 呵呵

这里我只能告诉你char是不可变得 varchar2是可变得,从这上来讲你是看不出有和效率上的优势的,是看怎么设计数据库。。。。。这才是效率

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:19:06
12#
 楼主| 发表于 2009-11-10 14:26 | 只看该作者
原帖由 zhanghong 于 2009-11-10 13:56 发表


以前我也问过这样的问题,首先你应该去 google一下。。然后再来问 呵呵

这里我只能告诉你char是不可变得 varchar2是可变得,从这上来讲你是看不出有和效率上的优势的,是看怎么设计数据库。。。。。这才是效率


其实只是想把这个问题搞清楚。。当然你讲的也很有道理。。这个问题本身的意义不大。呵呵。。

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:19:06
13#
 楼主| 发表于 2009-11-10 20:54 | 只看该作者
我不知道向块是否也象内存一样,需要写,要先申请空间(不过这不太可能).
如果是用多少,申请多少,char应该比varchar2高效一点吧,因为毕竟你一开始存储,就知道需要多少空间,申请空间可以一次搞定,而如果是varchar2则需要边写边申请。。
不过磁盘不是内存吧。应该不需要这样子。而且对于varchar2(4000)小于4kb,就算申请应该也不会每次只申请一个字符这样。。。
直接找出freelist中的块写下去就可以了。

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
14#
发表于 2009-11-11 01:36 | 只看该作者
原帖由 fan_zhen_hua 于 2009-11-10 06:54 发表
如果是用多少,申请多少,char应该比varchar2高效一点吧,因为毕竟你一开始存储,就知道需要多少空间,申请空间可以一次搞定,而如果是varchar2则需要边写边申请。。


When you request for space, you get a whole extent, which has multiple blocks. For each block, normally a row won't take up all its space. So there's really no issue of "用多少,申请多少".

But I still encourage you to do a test, and come back to tell us your test result.

Yong Huang

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
15#
发表于 2009-11-11 08:30 | 只看该作者
CHAR和VARCHR2的差别在于内部存储结构的不同,CHAR的数据和其他固定宽度列一样,按照建表时的顺序来存储;而VARCHAR2则不是,它的数据存储在所有固定长度的列数据后面,在他的位置上有一个指针或偏移量指向实际数据存储的位置。因此,我觉得,如果说精确的性能的话,CHAR应该是稍微好点的。但是,这两种类型应该说是各有各的适用用环境了,如果你知道数据宽度是固定的,为什么不用CHAR呢?但多数情况下,是不能预知每条数据的精确宽度的,因此,平时用VARCHAR2多些。

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
16#
发表于 2009-11-12 02:39 | 只看该作者
> 而VARCHAR2则不是,它的数据存储在所有固定长度的列数据后面,在他的位置上有
> 一个指针或偏移量指向实际数据存储的位置

That doesn't sound right. You can test by

create table testchar (x varchar2(10), y char(10));

and insert a bunch of rows with each string shorter than 10 characters. Dump the block(s). The result is like this:

col  0: [ 3]  61 62 63
col  1: [10]  61 62 63 20 20 20 20 20 20 20

I inserted 'abc' for both x and y columns. You see the space padded string still at the end of the row. (Tested in 10.2.0.4.)

Yong Huang

使用道具 举报

回复
论坛徽章:
41
马上加薪
日期:2014-02-19 11:55:14铁扇公主
日期:2012-02-21 15:02:402012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:50:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15ITPUB年度最佳BLOG写作奖
日期:2012-03-13 17:09:53
17#
发表于 2009-11-12 09:32 | 只看该作者
请参考《【比较】CHAR?or VARCHAR2?》
http://space.itpub.net/519536/viewspace-619424

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
18#
发表于 2009-11-13 07:03 | 只看该作者
原帖由 secooler 于 2009-11-11 19:32 发表
请参考《【比较】CHAR?or VARCHAR2?》
http://space.itpub.net/519536/viewspace-619424


I read your blog. You said:

> 7.如果我们只存储一位字符是不是就优先选择CHAR类型?
> 当然不是,从上面CHAR和VARCHAR2类型混用上得到的结论可见,最好不使用CHAR类型。

I think your conclusion is based on the complication with char type when you use bind variables. But the case here is that the number of characters is guaranteed to be the same and the length is always the full length of the column width (1 here). There shouldn't be any complication. Another case. The American social security number is always 9 digits. (I think it can start with 0 so number type is not good.) I don't see any difference between char(9) and varchar2(9), because the value passed to it is always like '123456789', '234567890', etc.

Yong Huang

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532010新春纪念徽章
日期:2010-03-01 11:20:50
19#
发表于 2009-11-13 11:19 | 只看该作者
简单理解

char和varchar2跟存储的数据本身没有关系,只是他们在相同长度的定义上实际占用的空间以及在数据的比较上不同.

1、一个是定长、一个是变长

char占用的空间始终和初始定义的长度一样.如果实际数据长度小于定义的长度,insert到数据库时会用blank补齐,比如char(5),最大可存储5个字符,如果你提供了四个字符的数据,那么第五个字符会用blank补齐;

varchar2占用的空间就是实际数据的长度,如果实际数据长度小于定义的长度,insert到数据库时不会用blank补齐,比如varchar2(5),最大可存储5个字符,如果你提供了四个字符的数据,那么第五个字符不会用blank补齐

2、字符比较上char采用blank-padded的策略,而varchar2采用nonpadded策略。
blank-padded就是比较时,长度小的数据会在末端追加空格,两边数据的长度相同后, 再比较; 比如这个时候 'a  ' = 'a'的
nonpadded就是比较时,不会在长度小的数据末端追加空格.那么这个时候'a  ' > 'a'的

使用道具 举报

回复
论坛徽章:
41
马上加薪
日期:2014-02-19 11:55:14铁扇公主
日期:2012-02-21 15:02:402012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:50:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15ITPUB年度最佳BLOG写作奖
日期:2012-03-13 17:09:53
20#
发表于 2009-11-13 11:25 | 只看该作者
@Yong Huang

同意,如果都是保存相同长度的内容,并且在使用绑定变量传参时也是固定的。那么二者区别不大,所以使用哪种类型都可以。
不过个人认为既然两种类型都可用,并且在某些情况下存在着一些容易出错的因素,我更倾向于统一使用VARCHAR2类型来保存字符串。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表