为什么“0D0”在SQL Server 2008中被视为数字?

时间:2010-12-13 15:38:19

标签: sql sql-server sql-server-2008

知道为什么ISNUMERIC('0D0') = 1在SQL Server 2008中为TRUE?

我正在验证来自另一个系统的ID号,它有时包含我们不想带来的字母,但这种组合使代码跳闸(它认为是数字的特定ID是“005406257D6”)。下游我们正在做CONVERT(BIGINT, @val),当它找到这些“D”值时显然会窒息。

我打的是什么特例,我该怎么说呢?

2 个答案:

答案 0 :(得分:11)

基本上,IsNumeric是无用的 - 它验证的是字符串可以转换为任何的数字类型。在这种情况下,“0D0”可以转换为浮点数。 (我不记得原因,但实际上“D”是“E”的同义词,并且意味着它是科学记数法):

select CONVERT(float,'2D3')
  

2000

如果你想验证它只是数字,那么not @val like '%[^0-9]%'将是一个更好的测试。您还可以通过添加长度检查来进一步改进。

答案 1 :(得分:0)

对原因的一个很好的解释。

http://www.sqlservercentral.com/articles/IsNumeric/71512/

(下面是@ RedFilter更详尽的查询/列表)

SELECT  [Ascii Code] = STR(Number)
       ,[Ascii Character] = CHAR(Number)
       ,[ISNUMERIC Returns] = ISNUMERIC(CHAR(Number))
FROM    Master.dbo.spt_Values
WHERE   Type = 'P'
        AND Number BETWEEN 0 AND 255
        AND ISNUMERIC(CHAR(Number)) = 1
UNION
SELECT  [Ascii Code] = STR(Number)
       ,[Ascii Character] = CHAR(Number)
       ,[ISNUMERIC Returns] = ISNUMERIC('0' + CHAR(Number) + '0')
FROM    Master.dbo.spt_Values
WHERE   Type = 'P'
        AND Number BETWEEN 0 AND 255
        AND ISNUMERIC('0' + CHAR(Number) + '0') = 1

yeilds

Ascii Code Ascii Character
---------- ---------------
     0      
     9      
    10      
    11      
    12      
    13      
    36  $   
    43  +   
    44  ,   
    45  -   
    46  .   
    48  0   
    49  1   
    50  2   
    51  3   
    52  4   
    53  5   
    54  6   
    55  7   
    56  8   
    57  9   
    68  D   
    69  E   
    92  \   
   100  d   
   101  e   
   128  €   
   160      
   162  ¢   
   163  £   
   164  ¤   
   165  ¥