数据库中的char类型的字段与number,varchar类型字段查询

oracle 的char 类型字段,在数据库中是固定长度的,而varchar2类型的是长度是可以变化的。假设某个字段的类型为char(20),这时将‘abc’保存到这个字段后,其实在数据库中保存的字符仍然是20字节,另外有17个字节是以空格保存的。而以varchar2来进行保存时,实际在机器中只占3个字节。

在效率方面,char的效率会比varchar更高些,这是因为在执行update语句修改varchar类型的字段时,当需要更新的数据比原来的数据需要占用更多的字节时,有可能会需要行迁移,也就是由于原来保存数据的内存地址无法保存需要更新的数据,需要进行数据迁移,更多的I/O。而char由于是固定长度的,update后的内容不会需要行迁移,必然可以保存在原来的地址,不会导致没必要的数据迁移。所以char类型的字段效率会更高些。


varchar类型的字段会更节省空间,由于会基于需要保存的字段基于内容来分配空间,而char类型的字段会固定保存相同的字节,不足的会空格补全。


曾经试过将mysql数据库的一张表在ESB里通过JPA框架将数据保存到另外一个数据库中,在msql数据库中的这张表的主键是自增长的,而在oracle数据库中的表的主键是char类型的,由于当mysql的表中的数据做了修改时,也需要同步到oracle数据库中,所以在数据保存到oracle中时,使用了merge方法,而merge方法实际上是执行了select语句,会以实体的主键字段来判断这条数据是否在表中已存在,当存在时会执行update语句,不存在时会执行insert语句。而当需要对已存在的数据进行更新时,调用merge语句后会执行inert语句,然后会报违反唯一约束错误。但merge语句时应该会执行update语句,后来发现原因是在执行select语句时,由于表的主键时char的类型,会自动填充空格,但select语句的主键并没有补充空格,这时select语句的结果集是返回空,然后执行insert语句,由于这时候主键会自动补全,这时发现表中已存在这个主键,所以报唯一约束错误。

     假设在mysql中的表的一条数据的主键为1250,这条数据保存到oracle的表中时,这张表的主键为char(20),当对mysql表中的数据中主键为1250的数据修改后同步到oracle时,执行select语句会找不到这条数据,这时需要查询语句的这个字段需要补全空格,长度为20字节。


另外在进行关联查询时,主键为char类型,另一张表的关联字段为number类型时,也会出现无法查找符合关联的数据。这种错误在mysql的工具中执行查询不会出现异常,通常在代码中会出现。当char类型的字段进行查询时,要谨记记得char会自动补空格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值