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

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

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


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语句,因为这时候主键会自动补全,这时发现表中已存在这个主键,因此报惟一约束错误。oracle

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


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