W MariaDB BINARY operator rzutuje ciąg za nim na ciąg binarny.
BINARY Operator umożliwia porównywanie kolumn bajt po bajcie, a nie znak po znaku. Powoduje to, że w porównaniu rozróżniana jest wielkość liter, nawet jeśli kolumna nie jest zdefiniowana jako BINARY lub BLOB . Oznacza to również, że spacje wiodące/końcowe stają się znaczące.
Przykład
Oto prosty przykład:
SELECT BINARY 'Cat'; Wynik:
+--------------+ | BINARY 'Cat' | +--------------+ | Cat | +--------------+
Ten przykład tak naprawdę nie pokazuje, w jaki sposób BINARY operator może wpływać na porównania ciągów. Poniższe przykłady tak.
Przestrzenie wiodące/końcowe
Jak wspomniano, spacje wiodące i końcowe są istotne podczas porównywania ciągów bajt po bajcie (np. z BINARY ).
Po pierwsze, oto porównanie ciągów bez żadnych spacji wiodących ani końcowych:
SELECT
'Cat' = 'Cat',
BINARY 'Cat' = 'Cat'; Wynik:
+---------------+----------------------+ | 'Cat' = 'Cat' | BINARY 'Cat' = 'Cat' | +---------------+----------------------+ | 1 | 1 | +---------------+----------------------+
Otrzymujemy tę samą zwracaną wartość, niezależnie od tego, czy używamy BINARY czy nie.
Ale oto, co się dzieje, gdy dodamy końcowe spacje do jednego z ciągów:
SELECT
'Cat' = 'Cat ',
BINARY 'Cat' = 'Cat ',
'Cat' = BINARY 'Cat ',
BINARY 'Cat' = BINARY 'Cat '; Wynik:
+----------------+-----------------------+-----------------------+------------------------------+ | 'Cat' = 'Cat ' | BINARY 'Cat' = 'Cat ' | 'Cat' = BINARY 'Cat ' | BINARY 'Cat' = BINARY 'Cat ' | +----------------+-----------------------+-----------------------+------------------------------+ | 1 | 0 | 0 | 0 | +----------------+-----------------------+-----------------------+------------------------------+
Pierwszy zwraca 1 podczas gdy inne (tj. te z BINARY ) zwróć 0 .
Dla pewności porównajmy ciągi, które mają na końcu spacje:
SELECT
'Cat ' = BINARY 'Cat ',
BINARY 'Cat ' = BINARY 'Cat '; Wynik:
+------------------------+-------------------------------+ | 'Cat ' = BINARY 'Cat ' | BINARY 'Cat ' = BINARY 'Cat ' | +------------------------+-------------------------------+ | 1 | 1 | +------------------------+-------------------------------+
Pamiętaj, że mówimy tutaj tylko o spacjach wiodących i końcowych. Ta koncepcja nie dotyczy spacji w środku ciągu.
Na przykład dwie spacje w ciągu nie są równe jednej spacji — nawet bez użycia BINARY operator:
SELECT 'Homer Jay' = 'Homer Jay'; Wynik:
+----------------------------+ | 'Homer Jay' = 'Homer Jay' | +----------------------------+ | 0 | +----------------------------+
W tym przypadku pierwszy ciąg zawiera jedną spację, a drugi dwie spacje. To wystarczy, aby były nierówne, nawet przy porównywaniu postaci.
Wrażliwość na wielkość liter
BINARY operator wymusza porównanie z uwzględnieniem wielkości liter, nawet jeśli w sortowaniu nie jest rozróżniana wielkość liter.
Na przykład, oto moje zestawienie połączeń:
SELECT @@collation_connection; Wynik:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
ci na końcu oznacza niewrażliwy na wielkość liter .
Oto przykład porównania ciągów wielkich i małych liter:
SELECT
'cat' = 'CAT',
BINARY 'cat' = 'CAT'; Wynik:
+---------------+----------------------+ | 'cat' = 'CAT' | BINARY 'cat' = 'CAT' | +---------------+----------------------+ | 1 | 0 | +---------------+----------------------+
Pierwsze porównanie zwróciło 1, ponieważ moje sortowanie nie uwzględnia wielkości liter. Drugi zwrócił 0 , ponieważ używamy BINARY operatora.
Wyniki, które otrzymujesz z takimi porównaniami ciągów (bez BINARY operatora) będzie zależeć od Twojego sortowania. Użycie sortowania z rozróżnianiem wielkości liter zwróci ten sam wynik, który otrzymaliśmy w przypadku BINARY .
Oto przykład do zademonstrowania:
SELECT
_latin1'cat' COLLATE latin1_general_ci = 'CAT' AS 'ci',
_latin1'cat' COLLATE latin1_general_cs = 'CAT' AS 'cs',
BINARY 'cat' = 'CAT'; Wynik:
+------+------+----------------------+ | ci | cs | BINARY 'cat' = 'CAT' | +------+------+----------------------+ | 1 | 0 | 0 | +------+------+----------------------+
Tutaj wyraźnie określiłem zestaw znaków i sortowanie na poziomie łańcucha. Składnia do tego wygląda tak:
[_charset_name]'string' [COLLATE collation_name]
Widzimy, że sortowanie bez uwzględniania wielkości liter zwróciło inny wynik niż sortowanie z uwzględnieniem wielkości liter. A sortowanie z uwzględnieniem wielkości liter zwróciło ten sam wynik, jaki otrzymujemy przy użyciu BINARY operatora.