Я немного расстроился из-за того, что не смог заставить это работать, и, поскольку я уже потратил полдня на эту довольно простую проблему, я откажусь от нее и спрошу вас, ребята.
Итак, у меня есть таблица SQL, в которой последний столбец называется flag:
name: type: collation: null: default:
...
flag varchar(250) utf8mb4_0900_ai_ci yes NULL
Данные имеют значение double или NULL, и я хочу выбрать все данные, которые не являются двойными. Но ни один оператор не дает никакого результата, например:
SELECT * FROM `table` WHERE `flag` NOT LIKE 'double';
SELECT * FROM `table` WHERE `flag` NOT LIKE '%double%';
SELECT * FROM `table` WHERE `flag` NOT LIKE '%d%';
SELECT * FROM `table` WHERE `flag` != 'double';
SELECT * FROM `table` WHERE NOT flag = 'double';
Я проверил каждую опечатку, в данных нет никаких странных/скрытых символов. Конечно, я мог бы сделать SELECT * FROM table WHERE flag IS NULL
который работает, но будут другие флаги > бесполезные.
Есть идеи, в чем здесь проблема?
mysql status:
--------------
mysql Ver 8.0.37-0ubuntu0.22.04.3 for Linux on x86_64 ((Ubuntu))
Connection id: 934
Current database:
Current user: user@localhost
SSL: Not in use
Current pager: less
Using outfile: ''
Using delimiter: ;
Server version: 8.0.37-0ubuntu0.22.04.3 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 1 hour 12 min 57 sec
Тип БД в InnoDB
спасибо, тоже работает. Я не знал об операторе <=> :)
LIKE
работает только со значениями, отличными от NULL
.IS NULL
/IS NOT NULL
для работы с NULL
отдельно.
NULL
, но выполняет только сравнение на равенство, а не LIKE
. Однако я предполагаю, что ваша сборка MySQL этого не поддерживает.LIKE
для сопоставления с образцом: похоже, вы выполняете только значение-(не)равенство.<>
, например:SELECT
*
FROM
`table`
WHERE
`flag` IS NULL
OR
`flag` <> 'double';
ОБНОВЛЕНИЕ: я забыл, что MySQL реализует IS DISTINCT FROM
, но с оператором космического корабля: <=> .
«Оператор LIKE работает только со значениями, отличными от NULL». Это была важная информация, спасибо. Можете ли вы уточнить, что вы подразумеваете под «только ценностью (не)равенством»? В чем разница с сопоставлением с образцом?
@melonlemon Используйте =
для равенства, используйте <>
(или !=
) для неравенства; используйте LIKE
для сопоставления символов с шаблоном (например, SELECT CompanyName FROM softwareCompanies WHERE CompanyName LIKE 'Micro%'
вернет 'Microsoft'
и 'Microprose'
). Хотя вы можете использовать LIKE
для равенства (т. е. =
), это запутывает любые указатели намерения в вашем SQL, что важно, если вы хотите, чтобы ваш SQL был самодокументируемым.
ах да, понял. Думаю, я просто переключился на НРАВИТСЯ, потому что он работает как подстановочный знак на случай, если в строках данных возникнут какие-то невидимые проблемы.
Смотрите это ОТЛИЧАЕТСЯ ОТ вопроса.