这是--或多或少--预期的行为。从SQL(ISO/ANSI)标准的副本来看。
两个字符串表达式的比较取决于用于比较的整理方式。当不等长的值被比较时,如果用于比较的整理法具有NO PAD
的特性,并且较短的值等于较长值的某个前缀,那么较短的值被认为小于较长的值。如果用于比较的排序具有PAD SPACE
的特性,为了比较的目的。 较短的值通过右边的<空格>连接有效地扩展到较长的值的长度。.
现在,大多数DBMS已经实现了字符串比较,但略有不同。在SQL_Server和MySQL中,你会发现''
、' '
、' '
和' '
(带有0、1、2和3个空格的字符串)都是相等的,不管它们被定义为VARCHAR
或CHAR
。
在Postges中,如果是VARCHAR
,它们都是不相等的,但如果是CHAR
,则相等(所以在VARCHAR
列中没有填充)。如果其中一个是VARCHAR,一个是CHAR,那么就会发现它们是相等的,所以我猜测在比较之前已经进行了填充。
Oracle与Postgres类似,但有一个额外的特点,即空字符串''
(几乎在所有地方)都表现为NULL
。所以,当你把它和带有一个或多个空格的字符串(或它本身)进行比较时,结果既不是True也不是False,而是UNKNOWN
。Oracle还有一个不同之处,如果一个字符串被定义为VARCHAR
,另一个被定义为CHAR
,那么比较就相当复杂。通过测试,我认为在这种情况下,只有CHAR
被填充,直到其(定义的数据类型)的长度,然后与未填充的VARCHAR
进行比较。
你可以检查(所有4个DBMS)在 SQL-Fiddle