为什么我从 sql-server 得到以下结果?
SELECT '' + 12 C1, CONVERT(int, '') C2,
CASE WHEN '' = ' ' THEN 'equal' ELSE 'not equal' END C3
Sql-Server Fiddle 演示 http://sqlfiddle.com/#!3/d41d8/9429
--Results
| C1 | C2 | C3 |
-------------------
| 12 | 0 | equal |
EDIT:C3已得到答复。大家纷纷思考回答'' + 12 = 12
是字符串连接,但它是一种数学运算。目前尚不清楚为什么(NOT how) ''
在 sql-server 中转换为 0。
这或多或少是预期的行为。来自 SQL (ISO/ANSI) 标准的副本:
两个字符串表达式的比较取决于用于比较的排序规则。当比较不等长度的值时,如果比较的排序规则具有NO PAD
特征并且较短的值等于较长值的某个前缀,则较短的值被认为小于较长的值。如果比较的排序规则具有PAD SPACE
出于比较的目的,通过在右侧连接 ,较短的值可以有效地扩展到较长的值.
现在,大多数 DBMS 都实现了字符串比较,但略有不同。在SQL_Server和MySQL中,你会发现''
, ' '
, ' '
and ' '
(带有 0、1、2 和 3 个空格的字符串)都是相等的,无论它们是否定义为VARCHAR
or CHAR
.
在 Postgres 中,如果它们是VARCHAR
但等于如果CHAR
(所以没有填充VARCHAR
列)。如果其中之一是 VARCHAR 和一个 CHAR,那么它们会相等,所以我猜填充是在比较之前完成的。
Oracle 与 Postgres 类似,但有一个额外的特点:空字符串''
行为(几乎在任何地方)为NULL
。因此,当您将其与带有一个或多个空格(或与其自身)的字符串进行比较时,结果既不是 True 也不是 False 而是UNKNOWN
。 Oracle 还有一个区别,如果一个字符串定义为VARCHAR
另一个作为CHAR
,比较起来比较复杂。根据测试,我假设只有CHAR
在这种情况下被填充,直到它们的(定义的数据类型)长度,然后与未填充的进行比较VARCHAR
.
您可以在以下位置检查(所有 4 个 DBMS):SQL-Fiddle http://sqlfiddle.com/#!4/ad51e/1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)