MySQL где в целых числах и где в строке - PullRequest
1 голос
/ 23 января 2020

Создать таблицу: CREATE TABLE tests (id int AUTO_INCREMENT, foo varchar(255), PRIMARY KEY (id));

Вставить записи: INSERT INTO tests (foo) VALUES ('36'), ('36A'), ('36B'), ('36C'), ('baz');

Выполнить: SELECT * FROM tests where foo in ('36');

Результат:

+----+------+
| id | foo  |
+----+------+
|  1 | 36   |
+----+------+

Тогда run: SELECT * FROM tests where foo in (36);

Результат:

+----+------+
| id | foo  |
+----+------+
|  1 | 36   |
|  2 | 36A  |
|  3 | 36B  |
|  4 | 36C  |
+----+------+

Вопрос в том, почему передача 36 (как целое число) не возвращает один и тот же столбец как передачу '36' (как строка) делает?

Кроме того, передача 3 приводит к пустому набору. Поэтому я не совсем понимаю логику c.

1 Ответ

1 голос
/ 23 января 2020

В MySQL существует неявное преобразование между числами и строками.

Если вы выполняете сравнение между целым числом и строкой, строка преобразуется в целое число. Чтобы преобразовать строку в целое число, MySQL читает первую цифру c цифр и игнорирует остальные. Так что '36A' имеет целочисленное значение 36. '36B' также имеет целочисленное значение 36. Если в строке нет начальных цифр, целочисленное значение по умолчанию равно 0.

В вашем случае вы сравниваете строковые значения в нескольких строках с целым числом 36, что означает, что оно преобразует каждое строковое значение сначала цифра c.

См. https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html

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