Python 3.x 大整数sqlite的值不正确
因此,简而言之,当向sqlite3数据库插入大整数时,例如Python 3.x 大整数sqlite的值不正确,python-3.x,sqlite,Python 3.x,Sqlite,因此,简而言之,当向sqlite3数据库插入大整数时,例如302140846680178689,它最终保存为302140846680178700,我不知道为什么最后1-2位有时不正确 我说有时是因为它不一致。例如,197918569894379520将保持197918569894379520 要重新创建的Python代码(我使用的是3.7.6 64位): 导入sqlite3 conn=sqlite3.connect(“example.db”) 某些id=302140846680178689 c=
302140846680178689
,它最终保存为302140846680178700
,我不知道为什么最后1-2位有时不正确
我说有时是因为它不一致。例如,197918569894379520
将保持197918569894379520
要重新创建的Python代码(我使用的是3.7.6 64位):
导入sqlite3
conn=sqlite3.connect(“example.db”)
某些id=302140846680178689
c=连接光标()
c、 执行(“创建表示例(一个文本,两个整数,三个大整数)”)
c、 执行(“插入示例值(?,?)”,(一些\u id,一些\u id,一些\u id))
康涅狄格州提交
康涅狄格州关闭
生成的表如下所示:
+--------------------+--------------------+--------------------+
| one(TEXT) | two(INTEGER) | three(BIG INT) |
+--------------------+--------------------+--------------------+
| 302140846680178689 | 302140846680178700 | 302140846680178700 |
+--------------------+--------------------+--------------------+
我希望整型和大整型的结果是一样的,看起来大整型只是整型的另一个名字,不管怎样它都是整型的?Sqlite将以quoteINTEGER的形式在内部管理大小。该值是有符号整数,根据值的大小存储在1、2、3、4、6或8字节中。
因此整数的最大大小似乎是2^63-1,它足够大,可以容纳302140846680178689
,而且它似乎也不会因为print(int(float(302140846680178689))-302140846680178689)模块而产生舍入误差,但我得到的差值是11
更新:根据评论中的问题提供更多信息
print(sqlite3.version)
> 2.6.0
print(sqlite3.sqlite_version)
> 3.28.0
c.execute("SELECT typeof(two) FROM example;")
print(c.fetchall())
> [('integer',)]
在脚本末尾添加以下内容:
print(type(some_id))
> <class 'int'>
打印(键入(某些id))
>
好吧,讽刺的是我自己没有测试我发布的手动查询代码
我不想仅仅为了查看数据而手动使用代码进行查询,而是更具体地使用了sqlite viewer
现在,我使用代码中的手动查询进行了测试,它返回了正确的值,但是由于某些原因,在该查看器中打开数据库会返回错误的值(我真的没有想到查看器有错,因为它只是从示例中查询SELECT*,现在我甚至尝试了不同版本的它,但仍然得到了相同的错误结果)
编辑来自开发人员的回复:查看器在库“SQLite.js”上工作JavaScript中的最大数字是9007199254740991,因此任何更多的数字都将被舍入。我似乎无法在Windows 10上使用SQLite 3.31.1 python 3.7复制这个问题。这可能是SQLite 3.1.1的问题吗?在Ubuntu 16.04上也无法使用python 3.5.2和SQLite 3.30.1复制。什么是打印(键入(某些id))
添加到该脚本的末尾显示您何时运行它?并从示例中选择typeof(2);
从sqlite3中选择?您是在Windows还是Linux上运行代码?我最近发现,即使在64位Windows上,Python实际上也会将int
视为32位: