MySQL неожиданно возвращает результаты для "WHERE integer_column = 'string_value'" - PullRequest
1 голос
/ 29 ноября 2011

Я запрашиваю столбец INT со строкой, например:

SELECT id
FROM (`navigation_links`)
WHERE `navigation_links`.`navigation_link_id` =  'anyRandomString'

(изначально это было случайно)

  • Ожидаемые результаты: 0, потому что navigation_link_id является INT
  • Фактические результаты: Кажется, что возвращается каждая строка, чье значение равно 0

Возвращает точное обратное значение:

SELECT id
FROM (`navigation_links`)
WHERE `navigation_links`.`navigation_link_id` !=  'anyRandomString'

Вот таблица, урезанная:

CREATE TABLE `navigation_links` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `navigation_link_id` INT(10) UNSIGNED NULL DEFAULT '0',
    `navigation_group_id` INT(10) UNSIGNED NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)

Есть идеи, что это такое?

1 Ответ

3 голосов
/ 29 ноября 2011

При сравнении значений разных типов MySQL попытается преобразовать одно из значений, чтобы сравнение было возможным.В случае строк и чисел MySQL преобразует строку, интерпретируя любые начальные цифры как число.Никакие начальные цифры не соответствуют числовому значению 0, что имеет смысл двумя способами:

  • часто можно отбрасывать начальные нули;«042» совпадает с «42».Таким образом, '0' и '' - это одно и то же.
  • При преобразовании числовой строки в число начальное значение для числа равно 0. Строка повторяется, добавляя цифры к числуи умножение на основание:

    n = 0
    while str[i] is a digit character:
        n += str[i] as a digit
        ++i
    return n
    

    Если нет цифровых символов, значение равно 0.

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

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