Как "None" может быть равен 0 в MySQL? - PullRequest
0 голосов
/ 25 сентября 2018

Я нахожу, что в одной таблице value "None" is equal to 0

mysql> select distinct id from sometable where id="None";
+-------+
|  id   |
+-------+
|     0 |
+-------+

Обратите внимание, что тип идентификатора int(7)!

Хотя все значение отображается как 0 в клиенте MySQL, когда я использую PyMySQL для запроса записей в django, некоторые из них равны 0, а другие имеют Unicode "None", как это могло произойти?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

MySQL свободно с преобразованиями типов.При неявном преобразовании строки в число, она будет принимать символы с начала строки, пока они являются цифрами, и игнорировать остальные.

В вашем примере "None" не является цифрой, поэтому MySQL вернет 0.

Из Mysql преобразование типов

Для сравнения строкового столбца с номером MySQL не может использовать индекс для столбца для быстрого поиска значения.

Неявное преобразование строки является ужасным для производительности, так как вы теряетеиспользование индекса для вашего столбца


Вот пример для сравнения "2arse" строки и 2 числа, мы можем видеть, когда ID = "2arse" вернет ID = 2 данные строкипотому что он будет принимать цифры 2 и игнорировать строку arse для неявного преобразования.

Схема (MySQL v5.7)

CREATE TABLE sometable(
  ID INT
);
INSERT INTO sometable VALUES (0);
INSERT INTO sometable VALUES (2);

Запрос № 1

select distinct id
from sometable
where ID = "2arse";

| id  |
| --- |
| 2   |

Просмотр на БД Fiddle

0 голосов
/ 25 сентября 2018

используйте приведение к int, затем сравните

select distinct id from sometable where cast(id AS SIGNED)=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...