oracle 中一个字符串放在 varchar2(100)和varchar2(4000)字段中用的空间都是一样的吗?如果一样还用定义长度干什么?

difficult 2011-08-12 10:37:08
如题
...全文
1218 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ding2wife 2014-04-02
  • 打赏
  • 举报
回复
引用 9 楼 ChinaGladiator 的回复:
1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),在数据库中它是以空格占位的,而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。    2.CHAR的效率比VARCHAR2的效率稍高。    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会更好一些。
学习啦 受益匪浅 感谢
TianChong 2012-11-14
  • 打赏
  • 举报
回复
引用 19 楼 yang15225094594 的回复:
如果存储的该列的长度的变化范围比较小的话,例如身份证号,学号等,位数都是固定的话,那么这时候使用char可以提高效率。但是如果范围变化比较的大的话,例如工作单位、或者包括少数民族名字的话,还是使用varchar2。 我的理解对啊?多谢! 引用 10 楼 的回复: varchar2(100)-->最多放100个字符; varchar2(4000)-->最多放4000个字符; 如果va……
是这样的。
月光xia漫步 2012-08-03
  • 打赏
  • 举报
回复
如果存储的该列的长度的变化范围比较小的话,例如身份证号,学号等,位数都是固定的话,那么这时候使用char可以提高效率。但是如果范围变化比较的大的话,例如工作单位、或者包括少数民族名字的话,还是使用varchar2。
我的理解对啊?多谢!
[Quote=引用 10 楼 的回复:]
varchar2(100)-->最多放100个字符;
varchar2(4000)-->最多放4000个字符;

如果varchar2(100)放“abc” varchar2(4000)也放“abc”,
那么他们的空间大小是一样的!

oracle在一边放,一边开辟空间!

char是直接开辟好空间,放的字节长度不到,就用空字符代替!
[/Quote]
qqhdqzzz 2011-10-20
  • 打赏
  • 举报
回复
楼上的几位已经说的很清楚了,数字是限制最大长度的
cutebear2008 2011-08-16
  • 打赏
  • 举报
回复
如果超过了100个字符,你怎么办???
长度当然是有意义的,要合理设置。
[Quote=引用 6 楼 fzqrf 的回复:]
引用 5 楼 difficult 的回复:
也就是和我定义的长度无关?那还定义长度干什么呀


我也一直很困惑这个问题
[/Quote]
yixilan 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chinagladiator 的回复:]
varchar2(100)-->最多放100个字符;
varchar2(4000)-->最多放4000个字符;

如果varchar2(100)放“abc” varchar2(4000)也放“abc”,
那么他们的空间大小是一样的!

oracle在一边放,一边开辟空间!

char是直接开辟好空间,放的字节长度不到,就用空字符代替!
[/Quote]
同意
回炉 2011-08-16
  • 打赏
  • 举报
回复
估计是底层的问题吧!可以先要确定定义的长度要哪儿才是空的问题吧!
yejihui9527 2011-08-16
  • 打赏
  • 举报
回复
C1 varchar2(100)-->最多放100个字符;
C2 varchar2(4000)-->最多放4000个字符;


v_C <=100 那么存入C1、C2的空间是一样的吧
「已注销」 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chinagladiator 的回复:]
1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),在数据库中它是以空格占位的,而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。   

2.CHAR的效率比VARCHAR2的效率稍高。   

……
[/Quote]

学习了!
新丁11111 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chinagladiator 的回复:]
1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),在数据库中它是以空格占位的,而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。   

2.CHAR的效率比VARCHAR2的效率稍高。   

……
[/Quote]
同意
huangdh12 2011-08-12
  • 打赏
  • 举报
回复
char() 这个才是定长的。 不过插入的数据是否够长度,都会占用相同的空间
huangdh12 2011-08-12
  • 打赏
  • 举报
回复
占用空间应该是一样的。 定义长度是 不允许长度超过定义的值
fzqrf 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 difficult 的回复:]
也就是和我定义的长度无关?那还定义长度干什么呀
[/Quote]

我也一直很困惑这个问题
tulang729 2011-08-12
  • 打赏
  • 举报
回复
楼上 说的比较 详细就不多说了
difficult 2011-08-12
  • 打赏
  • 举报
回复
也就是和我定义的长度无关?那还定义长度干什么呀
ksdy138141314 2011-08-12
  • 打赏
  • 举报
回复
你当前字段有多少字节就占多少字节
oO寒枫Oo 2011-08-12
  • 打赏
  • 举报
回复
varchar2 应该是存多少用多少 定义多长以当前这个字段需要保存的数据长度而定
difficult 2011-08-12
  • 打赏
  • 举报
回复
我问的空间一样是指空间大小一样吗?
ChinaGladiator 2011-08-12
  • 打赏
  • 举报
回复
varchar2是oracle中的变长的数据类型!不是定长的!varchar2(100)和varchar2(4000)的空间是不一样的!
ChinaGladiator 2011-08-12
  • 打赏
  • 举报
回复
varchar2(100)-->最多放100个字符;
varchar2(4000)-->最多放4000个字符;

如果varchar2(100)放“abc” varchar2(4000)也放“abc”,
那么他们的空间大小是一样的!

oracle在一边放,一边开辟空间!

char是直接开辟好空间,放的字节长度不到,就用空字符代替!
加载更多回复(1)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧