Проблема MySQL - запрос атрибутов базы данных с помощью string_value возвращает 0 для некоторых атрибутов и ВСЕ строки для других, почему? - PullRequest
1 голос
/ 23 марта 2019

У меня есть таблица в следующем формате.

|id | int_col|
--------------
1   | 0      |
2   | 0      |
--------------

DDL определяется ниже:

id - это первичный ключ - для него также установлено автоматическое увеличение

int_col - это атрибут

Я пробовал следующие запросы:

Select * from table_name where id='string_value';

Возвращает 0 строк.

Select * from table_name where int_col = 'string_value';

Возвращает все строки

Я не уверен, почему он вернул все строки. Я ожидал, что он вернет 0 строк для обоих запросов.

1 Ответ

0 голосов
/ 23 марта 2019

Для краткости: не сравнивайте строки и целые числа в MySQL .Это может привести к непредсказуемым результатам, таким как те, которые вы видите.

В соответствии с правилами преобразования MySQL , сравнение строки и целого числа фактически приводит к тому, что оба значения находятся под капотом и преобразуются в плавающую точкуцифры, а затем сравнили.Документация предупреждает:

Сравнения, в которых используются числа с плавающей запятой [...], являются приблизительными, поскольку такие числа неточны.Это может привести к результатам, которые кажутся противоречивыми.

Далее в документе можно найти еще один отказ от ответственности, который конкретно относится к сравнению целых чисел и строк:

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

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

Наконец, вот пример (возможного) несоответствия преобразования, также из документации MySQL:

mysql> SELECT '18015376320243458' = 18015376320243458;
        -> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...