INT和单个连字符( - )

时间:2016-07-12 12:47:09

标签: sql-server tsql casting int

我刚回答了这个问题:Concate Primary Keys in SQL

我遇到了一个奇怪的行为:

SELECT 5 + '-' +  8 

返回13

SELECT CAST('-' AS INT) 

返回0,解释了上述内容......

但是:为什么一个连字符会被隐含地归零?

Btw:单个+或(多个)空白字符串也一样......

这是相关的CAST hyphen (-) to Decimal但是指出这样一个事实,即施法到十进制不会带来这些结果......

4 个答案:

答案 0 :(得分:5)

我写这个作为答案,因为评论太长/太复杂 - 但这是基于我的评论。 还要注意 - 我没有正式的来源,所以没有确认我的逻辑是“什么实施”。 (但我觉得有道理:))

但假设您正在编写需要执行的转换函数。

所以你有一个要验证的字符串 - 例如#\w+(?<!#|$\w{6}#)
然后单独拍摄每个角色:

CAST('-50' AS INT);

所以假设字符串`-` is a valid part of the conversion, so move to next character. `5` is a valid part of the conversion, so move to next character. `0` is a valid part of the conversion, so move to next character. Done.

CAST('-' AS INT);

现在 - 您可以进行额外的检查以使其无效,因为`-` is a valid part of the conversion, so move to next character. Done. 不允许独立,但这需要额外的代码。

-和空格类似。 与货币和货币或期间和金钱一样:

+

两者都是有效字符 - 但实际上只与实际数字有关。但他们解析 - 表明这一切都是故意的,转换的速度似乎是明智的。

答案 1 :(得分:4)

这与负数和正数有关。我通过检查SELECT ISNUMERIC('-12') // Result: 1 SELECT ISNUMERIC('+12') // Result: 1 SELECT ISNUMERIC('.12') // Result: 1 (because "." can be cast to MONEY)

得出了这个结论
SELECT CAST('-' AS INT)

所以在你的情况下,SELECT CAST('-.' AS MONEY)会得到“负0”。即使 <Provider alias="media" type="Our.Umbraco.FileSystemProviders.Azure.AzureBlobFileSystem, Our.Umbraco.FileSystemProviders.Azure"> <Parameters> <add key="connectionString" value="**SECRET1**"/> 也是合法的。

答案 2 :(得分:1)

在表达式

5 + '-'

5INT类型的文字,'-'CHAR(1)类型的文字。 +将成为数字加法运算符,而不是字符串连接运算符,因为隐式地将CHAR转换为INT has higher priority than the other way around,这是不幸的。

'-'转换为INT会产生0,因为-+是合法的数字符号,并且允许使用没有任何数字的单个符号。为什么?好吧,因为他们是。据我所知,这在任何地方都没有记录。事实上,没有一条规则。 CONVERT(MONEY, ',,,')会产生0,因为,完全被忽略为数字分隔符,即使它们并未在此处分隔任何数字。 CONVERT(FLOAT, '+')是非法的,CONVERT(DECIMAL, '+')也是如此,但CONVERT(INT, '+')只是花花公子。联机丛书仅包含对行为的最简短引用。如果你反向设计实现这些行为的代码,你无疑会在解析器中找到一些古老而可疑的快捷方式,这些快捷方式现在都是为了兼容而维护的。

请注意,我非常确定如果转换代码是今天编写,Microsoft会注意 会产生错误(例如{ {1}},FLOAT或大多数其他数字类型),因为结果不必要地令人惊讶。但是我同样确定,依赖于这种转换的野外代码破坏的风险太大了。 (想象一下那里使用DECIMAL的所有文本文件作为&#34;不适用的&#34;当前导入为0的值,现在会因错误而中断。)

答案 3 :(得分:0)

默认情况下,在这种情况下,SQL Server会尝试强制转换为表达式中所有类型中具有最高优先级的类型。 Int的优先级高于char,因此SQL Server会隐式地将'-'强制转换为int。以下是关于SQL Server类型优先级的a documentation