SQL强制转换古怪

时间:2018-07-18 11:06:33

标签: sql sql-server casting sql-server-2014

我一直使用CONVERT(而不是CAST),因为我假设前者会识别类型并进行适当的转换,而后者只是试图以不同的方式解释字节流。但只是了解到CAST = CONVERT可以用于大多数用途!

但是有人可以解释为什么发生以下情况。 CAST对于相同的值(101)会产生不同的结果,但表示方式有所不同-十进制(101)和十六进制(0x65)表示形式。

select cast(0x65 as varchar(5))
-----
e

select cast(101 as varchar(5))
-----
101

编辑: 该查询是从SSMS运行的。

2 个答案:

答案 0 :(得分:4)

我假设您正在使用SQL Server(这两个函数之间的混淆很有意义)。

很简单。 0x定义了一个二进制常量101是一个数字常数。这些不是一回事。

将二进制常量转换为字符串时,它将尝试将常量解释为字符。当您将数字转换为字符串时,SQL Server会转换十进制表示形式。

您可以在documentation中进一步了解常量。

答案 1 :(得分:2)

您正在尝试转换为完全不同的值。正如戈登所说,一个是二进制表示形式,另一个是数字表示形式。

但是您需要注意CASTCONVERT之间存在一些差异:

  
      
  1. CAST是ANSI-SQL规范的一部分;而CONVERT不是。实际上,CONVERT是特定于Microsoft SQL Server实现的。
  2.   
  3. CONVERT的不同之处在于它接受可选样式   用于格式化的参数。
  4.   

在此处了解更多信息:https://www.essentialsql.com/what-is-the-difference-between-cast-and-convert/