【问题标题】:unsigned 64 bit value in sqlite with c bindings带有c绑定的sqlite中的无符号64位值
【发布时间】:2018-09-27 10:39:21
【问题描述】:

我正在尝试通过 c 绑定在 sqlite 中存储和检索无符号 64 位整数值。

例如18446744073709551615(小于2的64次方) 我似乎已经设法将这个值存储在数据库中。 当我在命令行上运行 sqlite3 并选择列时,我回来了 1.84467440737096e+19

我遇到的问题是使用 c 绑定检索值。 我打电话给 sqlite3_column_int64。 此函数返回一个带符号的 sqlite3_int64 值。 当我调用该函数时,它返回 9223372036854775807,这是有符号 64 位整数的最大大小(小于 2 的 63 次方) 好像没有 sqlite3_column_uint64 函数。

有什么想法吗?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    无符号 64 位整数不能直接用任何SQLite's data types 表示。

    您必须将它们存储为文本或 blob。在这两种情况下,数据库都无法对它们进行计算。

    【讨论】:

    • An other answer 说这是可能的。此外,您提供的链接说 INTEGER 可以是 8 字节长,即 64 位。我很困惑!
    • SQLite 的 64 位整数是有符号的,而不是无符号的(如问题中所述)。
    【解决方案2】:

    可以将 64 位无符号整数存储为原生 8 字节值,而无需将它们转换为文本或 blob。

    使用 INTEGER 类型定义表列。在语句绑定或其他写入操作之前 [使用 *_int64() 变体] 执行逐位转换为有符号的 64 位值,然后写入该值。

    阅读时反转过程。不会损失精度。

    实际上:有时将大值视为 63 位长的无符号值会有所帮助。只要您从不设置第 64 位,就不需要进行任何转换,一切都会正常运行,并按预期运行。 (并且不要忘记运行时/调试检查以确保执行 63 位规则。)

    也就是说:如果您确实使用逐位转换方法,则您不能使用该列依赖 SQLite 本机计算(除非您真的很擅长理解有符号值的编码方式。)您可以测试相等性而不会有太多麻烦,因为您已经擅长使用逐位转换值演员表。

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2011-01-17
      • 2023-03-11
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2018-11-05
      • 2015-09-28
      • 2011-09-01
      相关资源
      最近更新 更多