Короче говоря, при вставке огромных целых чисел в базу данных sqlite3, как, например, 302140846680178689
, она сохраняется как 302140846680178700
, и я не знаю, почему иногда последние 1-2 цифры неверны.
I говорят иногда, потому что это не соответствует. Например, 197918569894379520
останется 197918569894379520
.
Python для воссоздания кода (я использую 3.7.6 64bit):
import sqlite3
conn = sqlite3.connect("example.db")
some_id = 302140846680178689
c = conn.cursor()
c.execute("CREATE TABLE example(one TEXT, two INTEGER, three BIG INT)")
c.execute("INSERT INTO example VALUES (?,?,?)", (some_id, some_id, some_id))
conn.commit()
conn.close()
Полученная таблица выглядит следующим образом:
+--------------------+--------------------+--------------------+
| one(TEXT) | two(INTEGER) | three(BIG INT) |
+--------------------+--------------------+--------------------+
| 302140846680178689 | 302140846680178700 | 302140846680178700 |
+--------------------+--------------------+--------------------+
Я ожидал того же результата для целых и больших чисел, что и для точки 3.1.1. из документов кажется, что большое int - это просто другое имя для целого числа, и оно будет целым числом независимо от? Sqlite будет внутренне управлять размером как кавычкой INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
Таким образом, максимальный размер для целого числа, кажется, 2 ^ 63-1, который достаточно большой, чтобы соответствовать 302140846680178689
, и он также не кажется некоторым ошибка округления из модуля, поскольку print(int(float(302140846680178689)) - 302140846680178689)
дает -1
, и все же у меня есть разница 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'>