Неверное целое число, возвращаемое MySQL

0

Прежде чем отмечать ответ как дубликат, я хотел бы сказать, что я был в этом Q & A: Неправильное целое число (2147483647) вставляется в MySQL? и мои проблемы - это наоборот. MySQL неверно возвращает целое число. Как и раньше, я работаю с Steam API и у них действительно очень длинные IDs.

Ниже приведены следующие шаги, которые я выполнил:

  1. Получите идентификатор группы Dota2_items (103582791433341052) и вставьте в DB.
  2. Идентификатор из группы правильно хранится в базе данных
  3. Получите тот же номер из базы данных, которая теперь возвращает 103582791433341060

GiveawayTasks::where('id', 1)->first() который переводит из Laravel "select * from giveaway_task where id = 1"

Обратите внимание на 8 значений разницы между двумя идентификаторами. Похоже, что база данных добавила 8 значений к исходному идентификатору.

Чтобы решить эту проблему, я сделал PHP_MAX_INT который возвращает 9223372036854776000. Именно то, что я ожидал от 64 bit machine. Теперь я попытался вычесть PHP_MAX_INT и номер из базы данных, чтобы узнать, может ли int больше, чем PHP_MAX_INT:

PHP_MAX_INT - <Number from the database>9223372036854776000 - 103582791433341052 = 9119789245421434948 что приводит меня к выводу, что я не пытаюсь хранить больше одной переменной, чем может обрабатывать PHP_MAX_INT.

Я не уверен, что происходит здесь, так как это выходит за рамки моего опыта. Любая помощь будет принята с благодарностью.

Я использую структуру Laravel, но я не думаю, что это имеет отношение к делу.

  • 1
    Звучит очень похоже на неявное преобразование в double которое не может хранить последние цифры вашего большого значения и округляется в большую сторону. См., Например, MySQL Refman 5.7 , в котором есть аналогичный пример.
Теги:

2 ответа

0

Вместо использования Integers вместо этого используйте String для ваших ids. Вы получаете эту ошибку, потому что mysql имеет максимальное целочисленное значение 2147483647 for 32-bit по сравнению с вашим входом 103582791433341052. Это может решить проблему, если вы рассматриваете эти integers как String.

  • 0
    Как я могу сохранить правильное значение в базе данных, но не получить правильное значение?
  • 0
    MySQL или что-то промежуточное может преобразовать ваше большое число в 64-битное double значение.
Показать ещё 2 комментария
0

Вам нужно использовать BigInt, а не Int для типа столбца "id". Подробнее см. В этой таблице.

Изменение: Строки могут быть лучшей альтернативой, как предложено в комментариях ниже.

  • 1
    пожалуйста, приведите пример того, как он это сделает.
  • 0
    Нет. Он хранит «идентификаторы Steam», которые следует рассматривать как строки.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню