TL;DR
Това е NULL безопасно равно
оператор.
Като обикновения = оператор, две стойности се сравняват и резултатът е или 0 (не е равно) или 1 (равно); с други думи:'a' <=> 'b' дава 0 и 'a' <=> 'a' дава 1 .
За разлика от обикновения = оператор, стойности на NULL нямат специално значение и така никога не дава NULL като възможен резултат; така че:'a' <=> NULL дава 0 и NULL <=> NULL дава 1 .
Полезност
Това може да бъде полезно, когато и двата операнда могат да съдържат NULL и имате нужда от последователен резултат за сравнение между две колони.
Друг случай на употреба е с подготвени изрази, например:
... WHERE col_a <=> ? ...
Тук заместителят може да бъде скаларна стойност или NULL без да се налага да променяте нищо относно заявката.
Свързани оператори
Освен <=> има и два други оператора, които могат да се използват за сравнение с NULL , а именно IS NULL и IS NOT NULL; те са част от стандарта ANSI и следователно се поддържат в други бази данни, за разлика от <=> , което е специфично за MySQL.
Можете да ги мислите като специализации на <=> на MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Въз основа на това вашата конкретна заявка (фрагмент) може да бъде преобразувана в по-преносима:
WHERE p.name IS NULL
Поддръжка
Стандартът SQL:2003 въведе предикат за това, който работи точно като <=> на MySQL оператор в следната форма:
IS [NOT] DISTINCT FROM
Следното е универсално поддържано, но е относително сложно:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1