【问题标题】:Converting from integer to binary and back in SQL Server在 SQL Server 中从整数转换为二进制并返回
【发布时间】:2011-11-17 07:44:54
【问题描述】:

我整个上午都在用这个把头撞到墙上。

以下 SQL 代码及其结果对我来说毫无意义:

select CONVERT(INT, CONVERT(BINARY(30),2691485888))

导致:

-1060082528

什么?为什么结果不等于我原来的整数?

我的整个目标是将整数转换为字节并将这些字节存储到数据库中,但是如果没有让这个基本示例正常工作,我就被卡住了。谁能解释我做错了什么?

顺便说一下,我使用的是 Sql Server 2005 (9.0.4340)

【问题讨论】:

  • 您能解释一下为什么需要将整数转换为字节吗?为什么不能将其存储在 INT 列中?
  • @kekekela - 如果知道这背后的原因,一个更好的选择可能是答案。上下文很重要。
  • 一方面,2,691,485,888 比 INT 所能容纳的要大。
  • 使用 unsigned int 代替 int ;p

标签: sql sql-server tsql


【解决方案1】:

正如我在之前的评论中指出的,2,691,485,888 比 INT 所能容纳的要大。

这将起作用:

select CONVERT(BIGINT, CONVERT(BINARY(30), CONVERT(BIGINT, 2691485888)))

【讨论】:

  • 啊!这是有道理的。我一直不知道为什么我无法将 5B 转换为二进制,但这是因为它在显式转换为二进制之前将 5B 隐式转换为 int。非常感谢。
  • 是的,隐式演员也是我所缺少的。
  • 您也可以将其设为无符号以保持正常的 4 字节整数
【解决方案2】:

2691485888 的值不能保存在 INT 中 - 它太大了:

int -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647) 4 字节

您很有可能会看到溢出的结果。

可以处理该值的数据类型是 BIGINT。

【讨论】:

  • 有道理;但是有什么办法可以解决吗?
【解决方案3】:

2691485888 超出整数数据类型的上限(即 2147483647)

如果你把它转换成 bigint,它应该会得到正确的数量。

【讨论】:

  • 但是选择 CONVERT(BIGINT, CONVERT(BINARY(30),2691485888)) 返回 720575947909131424 这也是不正确的......
  • @Slider345:您得到意外答案的原因是 SQL Server 将文字值 2691485888 解释为 DECIMAL(10,0) 类型。如果您从 bigint 开始,则转换为 binary(30) 然后再转换为 bigint 只会让您回到开始的位置。请注意,这将为您提供结果 2691485888: SELECT CONVERT(DECIMAL(10,0), CONVERT(BINARY(30), 2691485888))
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多