数据类型CHAR(32)和VARCHAR2(32)的讨论

[复制链接]
查看11 | 回复7 | 2011-11-1 16:26:29 | 显示全部楼层 |阅读模式
CHAR(100)和VARCHAR2(100),本身的含义不用过多的讨论。
CHAR(100)用空格在数据的右侧补齐空格。
VARCHAR2(100)则保存实际的数据,不做处理。

那么如果在需求中,遇到一个值,其必然是一个100位的字符组成的数据。
那么这时候是CHAR(100)比较合适,还是VARCHAR2(100)比较合适。
其中CHAR(100),在创建表的时候,是已经分配了表空间了。
而VARCHAR2(100)则根据PCTFREE 10%来预留了10%的空间提供给VARCHAR2(100)。那么当VARCHAR2(100)的类型数据如果大于预分配的10%的空间,就会将这条记录重新找到一个ROWID去重新存储。可能比较耗时。
但是CHAR(100)在为NULL的时候,也是没有分配值的吧?

请大侠们分析一下啊。
如果在需求中,遇到一个值,其必然是一个100位的字符组成的数据。
这时候是CHAR(100)比较合适,还是VARCHAR2(100)比较合适。
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
还是建议使用varchar2,性能上没有多少区别的
你现在固定100位字符,谁能保证将来永远不会改变?需求是跟着市场走的。
我本人,一般只在char(1)时才使用char类型。
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
那就算是char(1), 你为什么不用VARCHAR2(1)呢?
而且此处确实就是不用考虑字符串的位数,它确实就是不会有变化的。一直就是100位。
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
那往往是代表真假值的字段,我们不愿用number(1),所以选择了char(1),这是因为,number(1)在一些java的中间层里可能会被自动替换成boolean型(不知道那些做中间件的人是怎么想的,呵呵)
不过总之,如果你确信你的长度都不会变化,那完全可以用char(100),我认为这没有任何问题
别在这个问题上纠结了,关注性能优化的关键点
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
char基本可以不用,见我们的书丁俊的章节
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
原帖由 〇〇 于 2011-9-1 14:23 发表
char基本可以不用,见我们的书丁俊的章节


见我们的书丁俊的章节.....这句话怎么说啊? 有点看不懂啊。呵呵
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
原帖由 gongcheng28 于 2011-9-1 17:09 发表

见我们的书丁俊的章节.....这句话怎么说啊? 有点看不懂啊。呵呵


剑破冰山—Oracle开发艺术
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
按TOM的建议,永远只用VARCHAR2, 哪怕是VARCHAR2(1),虽然此时和CHAR(1)没有差别。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行