我正在尝试通过c绑定在sqlite中存储和检索无符号的64位整数值。
例如18446744073709551615(小于2的1等于64的幂) 我似乎已经设法将此值存储在数据库中。 当我在命令行上运行sqlite3并选择列时,我回来了 1.84467440737096e + 19
我遇到的问题是使用c绑定检索值。 我正在打电话给sqlite3_column_int64。 该函数返回一个sqlite3_int64值,该值已签名。 当我调用该函数时,它将返回922337203685477575807,这是一个有符号的64位整数的最大大小(小于2的1等于63的幂) 似乎没有sqlite3_column_uint64函数。
有什么想法吗?
答案 0 :(得分:1)
无符号的64位整数不能直接由SQLite's data types中的任何一个表示。
您必须将它们存储为文本或Blob。在任何情况下,数据库都无法对它们进行计算。
答案 1 :(得分:0)
可以将 64 位无符号整数存储为原生 8 字节值,而无需将它们转换为文本或 blob。
使用 INTEGER 类型定义表格列。在语句绑定或其他写入操作之前[使用 *_int64() 变体] 逐位转换为有符号的 64 位值,然后写入该值。
在阅读时颠倒这个过程。不会有精度损失。
实际上:有时将大值视为 63 位长的无符号值会有所帮助。只要您从不设置第 64 位,就不需要转换,一切都会正常工作,并按预期运行。 (并且不要忘记运行时/调试检查以确保您执行 63 位规则。)
即:如果您确实使用逐位转换方法,则不能依赖使用该列的 SQLite 本地计算(除非您非常擅长理解带符号值的编码方式。)您可以测试相等性而不会遇到太多麻烦,因为您已经擅长使用逐位转换值演员。