Mysql-запрос с неявным преобразованием типа данных возвращает неверные результаты - PullRequest
0 голосов
/ 04 декабря 2018

mysql имеет автоматические, удобные преобразования числа в символ (и наоборот) в своем синтаксисе SQL-запроса, который ведет себя опасно.

рассмотрим таблицу с идентификатором пользователя varchar PK

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| userid     | varchar(40) | NO   | PRI | NULL    |       |
| cachetime  | datetime    | NO   |     | NULL    |       |
| outputjson | text        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

ошибка: любое число между 1538993648784210100 и 1538993648784210199, переданное как идентификатор пользователя, дает тот же результат.

mysql> select userid from test_cache where userid = 1538993648784210100;
+---------------------+
| userid              |
+---------------------+
| 1538993648784210176 |
| 1538993648784210178 |
+---------------------+

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

1 Ответ

0 голосов
/ 04 декабря 2018

Если вам нужны возможности числовой сортировки в столбце userid (например, BETWEEN), тогда этот столбец должен иметь числовой тип.Я предлагаю использовать DECIMAL(30) для этого столбца.Затем входящие числовые значения должны правильно сортироваться по этому столбцу в вашей таблице.

У вас есть несколько проблем.Во-первых, вы сравниваете userid с числовыми литералами, что означает, что под капотом будут действовать некоторые, возможно, экзотические правила приведения.Вы не хотите этого, и вы также не хотите сравнивать числа с текстовым столбцом.Используйте DECIMAL, и вы можете решить обе проблемы одновременно.

...