Неверное значение для больших целых чисел - PullRequest
0 голосов
/ 13 февраля 2020

Короче говоря, при вставке огромных целых чисел в базу данных 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'>

1 Ответ

0 голосов
/ 14 февраля 2020

Хорошо, ирония в том, что я сам не проверял код, который я отправил, с ручными запросами.

Я не хотел вручную делать запросы с кодом только для просмотра данных, но вместо этого я использовал средство просмотра sqlite более конкретно https://sqliteonline.com/

Теперь я проверил с помощью ручного запроса из кода, и он вернул правильное значение, однако открытие базы данных в этом средстве просмотра по некоторым причинам возвращает неверные значения (это действительно не так Мне не приходило в голову, что зритель был виноват, поскольку он буквально просто запрашивал SELECT * FROM example, теперь я даже попробовал разные его версии и все тот же неверный результат).

Редактировать ответ от dev: Зритель работает на библиотека «SQLite. js» и максимальное число в JavaScript равно 9007199254740991, поэтому любое число будет округлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...