MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Jak działa operator binarny w MariaDB

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uaktualnianie do najnowszej wersji Jira z najnowszą wersją serwera MariaDB

  2. Uwagi dotyczące szyfrowania danych w spoczynku dla MariaDB

  3. Migracja z bazy danych Oracle do MariaDB — co powinieneś wiedzieć

  4. Jak zapewnić wysoką dostępność bazy danych MySQL lub MariaDB w AWS i Google Cloud?

  5. Jak EXTRACT() działa w MariaDB