我有一个名为tab1的表,其列为col1,数据类型为varchar2(10),另一个名为tab2的表,其单个列为col2,数据类型为char(20)
数据如下:
tab1 tab2
a a
b b
c c当我运行以下查询时
select tab1.*,tab2.*
from tab1 full join tab2
on tab1.col1 = tab2.col2;我得到以下输出:
col1 col2
null a
null b
null c
a null
b null
c null我知道char占用固定内存,但是oracle不应该在字符串比较时加入吗?
发布于 2017-01-12 00:59:14
varchar2(10)只占用了所需的空间。
如果文本长度较小,char(20)将在末尾填充空白。
因此,在tab1 col1中,值a存储为a,但在tab2 col2中,值a存储为a,因此不匹配。
发布于 2017-01-12 00:58:55
Char被空白填充到它的全宽,所以您正在比较
'a ' with 'a'它们是不一样的
发布于 2017-01-12 01:22:25
直接从Oracle文档...
https://docs.oracle.com/database/122/SQLRF/Data-Type-Comparison-Rules.htm#SQLRF30027
空白填充和非填充比较语义
如果两个值的长度不同,则
首先在较短的值的末尾添加空格,以便它们的长度相等。然后,Oracle会逐个字符地比较这些值,直到第一个不同的字符。在第一个不同位置具有较大字符的值被认为较大。如果两个值没有不同的字符,则认为它们相等。此规则意味着,如果两个值仅在尾随空格的数量上不同,则它们是相等的。仅当比较中的两个值都是CHAR、NCHAR、text文本数据类型的表达式或USER函数返回的值时,Oracle才使用填充空格的比较语义。
使用非填充语义时,Oracle会逐个字符地比较两个值,直到第一个不同的字符。该位置的字符越大,则认为该值越大。如果两个不同长度的值在较短的一个值的末尾是相同的,则认为较长的值较大。如果两个长度相等的值没有不同的字符,则认为这两个值相等。只要比较中的一个或两个值的数据类型为VARCHAR2或NVARCHAR2,Oracle就会使用无填充的比较语义。
使用不同的比较语义比较两个字符值的结果可能不同。下表显示了使用每种比较语义比较五对字符值的结果。通常,空白填充和非填充比较的结果是相同的。表中的最后一个比较说明了空白填充和非填充比较语义之间的差异。
https://stackoverflow.com/questions/41596413
复制相似问题