В MySQL вставлено неверное целое число (2147483647)?

Итак, я поигрался с веб-API Steam, у меня есть одно из значений, хранящихся в переменной с именем $steam64. Когда я использую этот фрагмент кода для ВСТАВКИ его в базу данных mysql, он вставляет совершенно другое целое число, чем то, что хранится в переменной.

$sql_query = "INSERT INTO users_info (steam64) VALUES ('$steam64')";

var_dump($steam64); возвращает реальный int, так же как и эхо. Не слишком уверен, что здесь происходит, любая помощь приветствуется.


person Archey    schedule 21.04.2012    source источник
comment
Что вставлено (и что было выгружено) и какой является тип столбца? Скорее всего, это не ошибка в MySQL, а значит, проблема в другом...   -  person    schedule 21.04.2012
comment
не должны нуждаться в одинарных кавычках для целого числа. возможно, он пытается вставить строку $steam64 как целое число, преобразуя ее в процессе.   -  person Lazerblade    schedule 21.04.2012
comment
@pst 2147483647 вставляется, 76561197989628470 выгружается, тип столбца — int (255).   -  person Archey    schedule 21.04.2012
comment
@Lazerblade, просто имея его VALUES ($steam64), все равно вставляет неправильный int.   -  person Archey    schedule 21.04.2012
comment
dev.mysql.com/doc/refman/5.5/en/ целочисленные типы.html   -  person Eugine Joseph    schedule 31.07.2014


Ответы (10)


На основании вашего комментария о сбросе стоимости; число, которое вы пытаетесь вставить, слишком велико для 32-битных систем. Максимальное значение для 32-разрядной версии – 4 294 967 295, а для 64-разрядной версии – 18 446 744 073 709 551 615. Я бы рекомендовал преобразовать ваш столбец в хэш varchar(100), а не в int, или переключиться на 64-битную систему. Отличная статья о максимальном количестве целых чисел здесь и здесь.


Кроме того, прежде чем меня будут критиковать, обязательно прочитайте инъекцию SQL, если вы не очистка переменных, размещаемых непосредственно в операторах sql.

person Mike Purcell    schedule 21.04.2012
comment
Опубликовано обновление. Число, которое вы пытаетесь вставить, слишком велико. - person Mike Purcell; 21.04.2012
comment
Спасибо :) У PHP или MySQL есть ограничения? - person Archey; 21.04.2012
comment
Это системное ограничение, поэтому любое приложение, пытающееся получить доступ к такому большому числу, приведет к неожиданному поведению. - person Mike Purcell; 21.04.2012
comment
Хорошо, быстрый вопрос, если бы я хотел иметь цикл for с переменной, похожей на 76561197980000000, было бы это вообще возможно? - person Archey; 21.04.2012
comment
Да, если это не int. - person Mike Purcell; 21.04.2012
comment
@Pst: Спасибо за исправление, я должен был знать, когда вставлял значения. - person Mike Purcell; 21.04.2012

2147483647 — это наибольшее значение int для mysql. Просто измените тип с int на bigint.

person George    schedule 22.07.2013
comment
Стоит отметить, что BIGINT имеет ограничение от -9223372036854775808 до 9223372036854775807 (со знаком) или от 0 до 18446744073709551615 (без знака). если вам нужно ТОЛЬКО ПОЛОЖИТЕЛЬНОЕ целое число, используйте что-то вроде COLUMNNAME BIGINT(32) UNSIGNED DEFAULT 0 - person Lewis; 17.05.2017

Пока я играл с SQL и MySQL, у меня была такая же проблема с типом данных MySQL int. Исправлена ​​ошибка изменения типа данных с int на bigint.

http://dev.mysql.com/doc/refman/5.7/en/integer-types.html

ALTER TABLE tablename MODIFY columnname BIGINT; 
person Lyserty    schedule 03.08.2016

Наибольшее значение для типа данных INT — 2147483647. Если вставляемое число больше 2147483647, это вызовет проблему. Для решения измените тип данных с INT на BIGINT, поскольку BIGINT имеет максимальное значение 9223372036854775807, это может решить вашу проблему. Взгляните на этот сайт: https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

person Nadeem Shakya    schedule 30.06.2017

Просто измените тип данных с INT на BIGINT

person Ron Varghese    schedule 29.03.2018

Целочисленный тип INT занимает 4 байта, вы получаете от -2^(4*8-1)=-2147483648 до 2^(4*8-1)-1=2147483647, когда у вас есть флаги "signed", если вы измените флаги на unsigned у вас будет диапазон от 0 до 2^(4*8)-1 . MySQL поддерживает BIGINT как хранилище размером 8 байт. Если вы попытаетесь сохранить большее значение, вы сохраните максимальное значение диапазона

person Rodney Salcedo    schedule 25.08.2015

Перейдите в раздел «Операции» -> «Параметры таблицы» -> измените значения приращения на минимум или на то, что вы хотите увеличить.

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

person lalit mohan    schedule 04.08.2015

Согласитесь с изменением типа данных на BIGINT с INTEGER. В настоящее время при создании веб-приложения с помощью node.js/sequelize приведенный ниже рефакторинг решил, что сообщение с номером телефона из формы реакции-редукции изменено на «2147483647»:

clientPhone: {
    type: DataTypes.BIGINT,
    allowNull: true
},
person Peter Tountas    schedule 06.06.2017

Самый простой способ - изменить в MySQL «int» на «varchar».

person MatiiTv    schedule 19.02.2016
comment
Не делай этого. Никогда не делайте этого. VARCHAR — это строковое представление, а не числовое. Было бы невозможно выполнять математические операции над строкой. - person mwieczorek; 10.12.2017

person    schedule
comment
хм ... и это отвечает на вопрос, потому что ... ? - person kleopatra; 10.08.2013
comment
Это не имеет смысла, не пытайтесь сделать вывод из этого ответа, если вы здесь с этой проблемой. - person Lewis; 17.05.2017