Сообщаемое повторяющееся значение 2147483647
также может быть выражено как 2 ^ 31-1, что также является максимальным значением, которое может быть сохранено с помощью 32-разрядного целого числа со знаком INT
типа в MySQL.
Я подозреваю, что тип данных столбца userid
- это INT (только предположения), и я подозреваю, что оператор INSERT
пытается предоставить значение, большее, чем может быть сохранено в INT
типе данных. Поведение MySQL состоит в том, чтобы выдавать предупреждение и урезать значение до максимального значения, которое может быть сохранено, и разрешить выполнение инструкции.
Я ожидаю, что мы получим другую ошибку с другим значением sql_mode
возвращать ошибку усечения данных, а не предупреждение об усечении данных.
Обратите внимание, что SELECT не будет выдавать предупреждение или ошибку, проверяя наличие строки. Это просто не собирается возвращать строку.
Для отладки рассмотрите echo / printf / vardump значения, включенного в текст SQL. (Также рассмотрите возможность использования подготовленного оператора с заполнителями связывания как способ смягчения SQL уязвимостей внедрения.)
В качестве демонстрации поведения, которое мы наблюдаем в MySQL со значениями, которые больше, чем можно сохранить в INT
, рассмотрим:
USE test ;
CREATE TABLE foo (id INT PRIMARY KEY) ;
-- # 0 row(s) affected
INSERT INTO foo (id) VALUES (2147483648) ;
-- # 1 row(s) affected, 1 warning(s)
-- # Warning Code : 1264
-- # Out of range value for column 'id' at row 1
SELECT id FROM foo ;
-- # id
-- # -----------
-- # 2147483647
SELECT id FROM foo WHERE id = 2147483649 ;
-- # 0 row(s)
INSERT INTO foo (id) VALUES (2147483649) ;
-- # Error Code: 1062
-- # Duplicate entry '2147483647' for key 'PRIMARY'
DROP TABLE foo ;
-- # 0 row(s) affected