【问题标题】:Can T-SQL store ulong's?T-SQL可以存储ulong的吗?
【发布时间】:2011-02-26 20:58:51
【问题描述】:

我想将 C#.NET ulong 存储到 T-SQL 数据库中。我没有看到任何这样做的规定,因为 SQL bigint 具有与普通 long 相同的最小值/最大值。

有什么办法可以做到吗?还是抓住OverflowException 我唯一的希望?

【问题讨论】:

  • this answer,它告诉你使用DECIMAL(20,0) CHECK (columnName >= 0 AND columnName <= 18446744073709551615)

标签: c# .net sql bigint ulong


【解决方案1】:

这应该回答你的问题:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/ff08c190-a981-4896-9542-3f64b95a84a2/

您将使用 BigInt,您只需要小心在 C# 中如何将有符号类型转换回无符号类型

// This has not been tested
unchecked
{
    myUlong = myDataReader.GetInt64(...);
}

...

另一种可能是使用长度为8的VarBinary,然后在C#中将字节转换为ulong

【讨论】:

  • @Robert Harvey:我发布了一个简短的例子
  • 您的意思是将long.MinValue 视为0long.MaxValue 视为ulong.MaxValue
  • 有符号位的行为是否在这里正确定义?如果你不想失去精度,你必须使用符号位作为ulong中的附加高位。这会那样做吗?
  • @Robert Harvey:这就是为什么它没有被选中。 ulong无所谓高位,只需要8个完整字节。
  • @barnes:你还记得“未检查”的代码块吗?
【解决方案2】:

我知道这不一样,但是这样可以吗:

select convert(decimal(38, 0), 12345678901234567890123456789012345678)

无符号长整数的最大值似乎是 18,446,744,073,709,551,615,明显小于这个十进制可以存储的值。转换可能会出现问题,但我确信您的应用程序中的几个包装函数会很快对其进行排序。

【讨论】:

  • 适应 ulong 范围的好方法,但请注意 sql 报告 decimal(38,0) 占用 17 个字节。
  • 你是说我们要存储的数据量太大了?
  • @Johnathan:我想是的。 decimal(38,0) 的大小是 bigint 的两倍多(实际上是 2.125 倍)。如果空间是个问题,我会有点担心。
  • @Onion-Knight 无符号长整数的maximum value 是 18,446,744,073,709,551,615,这意味着您只需要DECIMAL(20, 0)。这需要 13 个字节而不是 17 个字节。 DECIMAL 相对于BIGINT 的优势在于它将保留您存储的数字的语义含义。任何其他应用程序、ETL、报告或查看数字的人都会理解它们。从数据架构师的角度来看,这证明了存储损失是合理的。另一方面,BIGINT 将向读者呈现负数(即谎言)。
【解决方案3】:

对我来说,Neil N 的解决方案不起作用。 Visual Studio 一直抱怨我无法将 long 值分配给 ulong 变量,无论 unchecked 是什么。

最终起作用的只是

ulong fileSize = (ulong)(long)reader["fileSize"];

(没有unchecked)。

在 SQLite DB 中,该值存储为 long,因此非常高的值变为负数,并且在 SQL 端对它们进行排序失败。但是在获得ulong 值之后,Linq 可以发挥它的魔力

items = items.OrderByDescending(x => x.FileSize).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2018-10-03
    • 2013-05-28
    相关资源
    最近更新 更多