这或多或少是预期的行为。从 SQL (ISO/ANSI) 标准的副本:
两个字符串表达式的比较取决于用于比较的排序规则。当比较长度不等的值时,如果用于比较的排序规则具有NO PAD
特征并且较短的值等于较长值的某个前缀,则认为较短的值小于较长的值。如果用于比较的排序规则具有PAD SPACE
特征,则为了比较的目的,通过将右侧的 <space> 串联起来,将较短的值有效地扩展到较长的值。
现在,大多数 DBMS 已经实现了略有不同的字符串比较。在 SQL_Server 和 MySQL 中,你会发现''
,' '
和(0, 1, 2' '
和' '
3 个空格的字符串) 都是相等的,无论它们是否定义为VARCHAR
or CHAR
。
在 Postges 中,如果它们相等,它们都是不相等的,VARCHAR
但如果相等(因此在列CHAR
中没有填充)。VARCHAR
如果其中一个是 VARCHAR 和一个 CHAR,那么它们是相等的,所以我猜想在比较之前填充。
Oracle 与 Postgres 类似,但空字符串的''
行为(几乎无处不在)为NULL
. 因此,当您将其与具有一个或多个空格的字符串(或与自身)进行比较时,结果既不是 True 也不是 False,而是UNKNOWN
. Oracle还有一个区别,如果一个字符串定义为VARCHAR
,另一个字符串定义为CHAR
,比较比较复杂。从测试中,我假设仅CHAR
在这种情况下被填充,直到它们的(定义的数据类型)长度,然后与 unpadded 进行比较VARCHAR
。
您可以在SQL-Fiddle中检查(所有 4 个 DBMS)