Nano Hash - криптовалюты, майнинг, программирование

Магия предложения where в MySQL

Я нашел кое-что в MySQL, что меня очень удивило. Я создал таблицу и вставил в нее записи, как показано ниже,

CREATE TABLE `test` (
   `ID` int,
   `NAME` varchar(100)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO test VALUES (1,'a'),(2,'b'),(3,'c');

Теперь я запускаю два запроса SELECT против этого, как показано ниже:

select * from test where id;

select * from test where name;

Я заметил, что эти запросы не вызывают синтаксических ошибок, но запрос выбора «первый» возвращает результат как select * from test;, а «второй» не возвращает ничего. Это означает, что если предложение where содержит столбец «integer», я получаю набор результатов, в то время как я не получаю ничего, если предложение where содержит столбец «varchar».

Может ли кто-нибудь сказать мне, является ли это ошибкой или особенностью MySQL? Также объясните мне, почему это происходит.

Заранее спасибо!

02.01.2015

  • Чего ты хочешь? Вы имеете в виду SELECT id FROM test? 02.01.2015

Ответы:


1

В MySQL 0 - это false, а not 0 - это true. Так

where id, например, похож на where 1.

Итак, ваши ids все true и возвращают запись.

Но name не может быть автоматически преобразован в число not 0 и равно false.

Кстати, если значение столбца name будет начинаться с числа, тогда оно будет преобразовано в это число и будет true (например, 1tom вернется в 1).

02.01.2015
  • Привет, почему этого не происходит для столбцов varchar? 02.01.2015
  • Поскольку строка, которая не начинается с числа, будет преобразована в число 0 для выполнения логического сравнения 02.01.2015
  • Понятно! Большое спасибо, Юрген! :) 02.01.2015

  • 2

    name столбцы преобразуются в 0, потому что они не numerical format. Его можно было бы получить, если имя «2» с предупреждениями.

    mysql> CREATE TABLE test (id INT, name VARCHAR(20));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> INSERT INTO test VALUES (0, 'a'), (1, 'b'), (2, '2');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM test WHERE name;
    +------+------+
    | id   | name |
    +------+------+
    |    2 | 2    |
    +------+------+
    1 row in set, 2 warnings (0.00 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1292 | Truncated incorrect INTEGER value: 'a' |
    | Warning | 1292 | Truncated incorrect INTEGER value: 'b' |
    +---------+------+----------------------------------------+
    2 rows in set (0.00 sec)
    
    02.01.2015
  • Большое спасибо! Понятно! :) 02.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..