Oracle的CHAR类型是固定长度,VARCHAR2不是固定长度,只有最大长度,所以VARCHAR2比CHAR节约,但没有CHAR效率高。而CHAR在进行比较时是使用blank-padded语义 ,即自动填充空格,使比较中的两个CHAR类型达到长度相同,VARCHAR2使用nopadded,不自动填充空格。所以两个CHAR类型的字段,‘abc'即可等于'abc ’,而如果是VARCHAR2类型,则'abc'不等于'abc '。注意,如果是CHAR类型,'abc'存入后,该字段的长度不是3,而取决于创建时设计的CHAR长度,如CHAR长度设为5,则存入数据'abc'后,将在最后自动补充两个空格,变为'abc ',其长度就是5,而不是3,如果是VARCHAR2,则存入的数据长度是多少就是多少,只要不超过VARCHAR2的最大长度,一个最大长度是50的VARCHAR2,存入'abc',长度就只是3,而不是50,当然它所能存入的最大长度不能超过50个字符。
用到查询子句里,如where子句,就有意思了。假设表里有一个固定长度为5的CHAR字段char_1,存入一个'abc'的数据,如果用查询命令select * from table1 where char_1='abc',是可以查到的,因为在比较时会在较短的字符串后面填补空格达到相同的长度再进行对比,如果是where char_1='abc ',也是成立的,虽然比较的字符串长度已经远远超过char_1的长度5。如果不用=,用in,如... where char_1 in ('abc '),也成立。尽管如此,查询出来的结果中char_1的长度仍是5(该字段的所有数据长度都是5),可以用select length(char_1) from table1 where char_1='abc '验证。
如果换为长度为50的VARCHAR2的字段varchar_1,仍然存入'abc',用where varchar_1='abc'查询,也能查出'abc’这个结果,因为在varchar_1中保存的就是长度为3的字符串'abc',虽然它的最大长度是50个字符,但此时如果用where varchar_1='abc ',就找不到'abc‘了,除非表里有一个'abc ',这时用length得到的是数据的实际长度(该字段的数据长度是可变的)。
但是到了decode函数里,即使是CHAR也不会自动填补空格来拉平长度,在decode函数中一个CHAR类型的字段只能与和它相同长度的数据(字符串)进行比较,比如上面的例子,decode(char_1,'abc ',1,0)的结果就是1,decode(char_1,'abc',1,0)的结果是0,而decode(varchar_1,'abc',1,0)的结果是1,因为在VARCHAR2字段中的'abc'就只保存3个字符。
因此为避免可能的差错,可以使用trim函数去掉数据前后的空格,不论在where子句还是decode这类的函数中,用了trim,'abc’和'abc '在内容上就可以相等了。
>> 除非说明均为原创,如转载请注明来源于http://www.stormcn.cn/post/1677.html