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

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

Обратите внимание, что тип id - int(7)!

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

1
Jay 25 Сен 2018 в 10:46

2 ответа

Лучший ответ

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
D-Shih 25 Сен 2018 в 08:16

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

select distinct id from sometable where cast(id AS SIGNED)=0
0
Zaynul Abadin Tuhin 25 Сен 2018 в 08:00