Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 大整数sqlite的值不正确_Python 3.x_Sqlite - Fatal编程技术网

Python 3.x 大整数sqlite的值不正确

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=

因此,简而言之,当向sqlite3数据库插入大整数时,例如
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将以quote
INTEGER的形式在内部管理大小。该值是有符号整数,根据值的大小存储在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位: