相关文章推荐
低调的打火机  ·  SQL ...·  2 月前    · 
爱喝酒的核桃  ·  关于Kafka ...·  1 年前    · 
个性的脆皮肠  ·  python setup.py ...·  1 年前    · 
很拉风的罐头  ·  c++ - QCPItemLine ...·  2 年前    · 
SELECT '' + 12 C1, CONVERT(int, '') C2,
       CASE WHEN '' = ' ' THEN 'equal' ELSE 'not equal' END C3

Sql-Server Fiddle演示

--Results
| C1 | C2 |    C3 |
-------------------
| 12 |  0 | equal |

编辑:C3已经得到了回答。每个人的回答都认为'' + 12 = 12 是字符串连接,但它是一个数学运算。不清楚为什么(不是如何)'' 在sql-server中转换为0。

6 个评论
Oded
你是在说'' = ' ' (空字符串与单个空格相比)?
Oded
但由于你有三种不同的情况,你在使用'' ,不清楚你是否发现'' + 12CONVERT(int, '')'' = ' ' 的结果是出乎意料的。其中有两个我会期待,一个我不会,但其他人可能有其他期待。我要求澄清的是--只显示你所问的代码--额外的东西只是掩盖了这个问题。
Kaf
@Oded:我自己测试了空字符串是否可以转换为int,这就是c2出现的原因。我不是故意要混淆的。
Oded
我明白这是你测试的一部分,但它不应该是问题的一部分......
Oded
好的。并不清楚这三个都是不被期待的......就像我说的,对我来说,有两个是被期待的。
这些看起来像是预期的结果。
sql-server
sql-server-2008
tsql
sql-server-2012
Kaf
Kaf
发布于 2013-02-25
3 个回答
ypercubeᵀᴹ
ypercubeᵀᴹ
发布于 2013-02-25
0 人赞同

这是--或多或少--预期的行为。从SQL(ISO/ANSI)标准的副本来看。

两个字符串表达式的比较取决于用于比较的整理方式。当不等长的值被比较时,如果用于比较的整理法具有NO PAD 的特性,并且较短的值等于较长值的某个前缀,那么较短的值被认为小于较长的值。如果用于比较的排序具有PAD SPACE 的特性,为了比较的目的。 较短的值通过右边的<空格>连接有效地扩展到较长的值的长度。.

现在,大多数DBMS已经实现了字符串比较,但略有不同。在SQL_Server和MySQL中,你会发现''' ''  ''   ' (带有0、1、2和3个空格的字符串)都是相等的,不管它们被定义为VARCHARCHAR

在Postges中,如果是VARCHAR ,它们都是不相等的,但如果是CHAR ,则相等(所以在VARCHAR 列中没有填充)。如果其中一个是VARCHAR,一个是CHAR,那么就会发现它们是相等的,所以我猜测在比较之前已经进行了填充。

Oracle与Postgres类似,但有一个额外的特点,即空字符串'' (几乎在所有地方)都表现为NULL 。所以,当你把它和带有一个或多个空格的字符串(或它本身)进行比较时,结果既不是True也不是False,而是UNKNOWN 。Oracle还有一个不同之处,如果一个字符串被定义为VARCHAR ,另一个被定义为CHAR ,那么比较就相当复杂。通过测试,我认为在这种情况下,只有CHAR 被填充,直到其(定义的数据类型)的长度,然后与未填充的VARCHAR 进行比较。

你可以检查(所有4个DBMS)在 SQL-Fiddle

Kaf
谢谢,C3的结果很清楚,但不知道为什么要这样做。C1/C2?
Kaf
反之亦然。+在这里被视为string concatenation 。它是数学运算符。请查看这个演示
@Kaf:你是对的,我的错误。情况其实更复杂,但在这种情况下你是对的。
Oded
Oded
发布于 2013-02-25
0 人赞同

C1 - 这里发生了一个隐式转换,空字符串被转换为0。这就解释了为什么你会得到 (`0 + 12)。12

C2 - 将 明确转换为整数的结果是 。这有点像图书馆,但这就是它的工作原理(而且可能会改变--据我所知,这并没有记录在案,如果有人知道,请纠正我)。'' 0