【问题标题】:Converting int value to a char that is too small将 int 值转换为太小的 char
【发布时间】:2010-06-30 13:34:50
【问题描述】:

在 MSSQL 2005 上尝试以下操作:

select convert(char(2), 123)

这里的关键是 char(2) 太小而无法接受值 '123'。我希望在这里看到截断错误,但返回的是值“*”。

更新: 一些答案显示了如何以会导致错误的方式进行投射。这不是我真正需要的。我们有很多使用特定字段的代码,这些字段曾经被声明为 char(2),但后来被更改为 int。我的目标是确保尚未转换的代码在遇到无法处理的数据时会崩溃。所以我们可以去修复它。

有趣的是,dsolimano 指出将上述类型更改为 nchar 会导致预期的错误,Justin Niessner 指出这两者都是设计使然。奇怪的不一致,因为 nchar 是为了支持 Unicode,嘿?

从我在这里得到的答案看来,很遗憾我无法让服务器为现有代码抛出错误。

【问题讨论】:

    标签: sql sql-server truncation


    【解决方案1】:

    Microsoft 的 convert/cast page 似乎表明,如果你想得到一个错误而不是 * 或截断,你可以强制转换为 nchar(2),这确实是我得到的:

    SELECT CAST(123 AS NCHAR(2))
    
    Msg 8115, Level 16, State 2, Line 3
    Arithmetic overflow error converting expression to data type nvarchar.
    

    【讨论】:

    • 在我的情况下,更改代码以引发错误比一开始就修复它更没有意义。但我真的很喜欢你的回答,因为它告诉我为什么会这样。
    【解决方案2】:

    向下滚动以下 MSDN 页面:

    CAST and CONVERT (Transact-SQL)

    直到您到达标题截断和舍入结果

    您会看到您所看到的行为是已定义的行为。

    如果您希望发生截断以便只获得两位数字,那么您可以尝试:

    select cast(convert(varchar(10), 123) as char(2))
    

    【讨论】:

      【解决方案3】:

      在将其转换为太小的字符串之前,只需将其转换为可变长度的字符串。

      Select Cast( Cast( 123 as varchar(10) ) As char(2) )
      

      【讨论】:

        【解决方案4】:

        SQL Server 将毫无问题地截断字符串。因此,您可以先将值转换为varchar,然后再将其转换为char(2)

        select convert(char(2), cast(123 as varchar(128))
        

        【讨论】:

          【解决方案5】:

          取决于您所说的“防止”这种情况发生是什么意思?你希望发生什么?什么都没有?

          DECLARE @number INT
          SET @number = 123
          
          IF(@number < 100) SELECT CONVERT(char(2), @number)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-31
            • 2012-08-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多