sql >> Database teknologi >  >> RDS >> MariaDB

Hvordan den BINÆRE operatør fungerer i MariaDB

I MariaDB er BINARY operatoren kaster strengen efter den til en binær streng.

Den BINARY operatoren giver dig mulighed for at lave en kolonnesammenligning byte for byte i stedet for tegn for tegn. Dette får sammenligningen til at skelne mellem store og små bogstaver, selvom kolonnen ikke er defineret som BINARY eller BLOB . Det betyder også, at førende/slæbende rum bliver væsentlige.

Eksempel

Her er et simpelt eksempel:

SELECT BINARY 'Cat';

Resultat:

+--------------+
| BINARY 'Cat' |
+--------------+
| Cat          |
+--------------+

Dette eksempel viser ikke rigtig, hvordan BINARY operatør kan påvirke strengsammenligninger. Det gør de følgende eksempler.

Leading/Trailing Spaces

Som nævnt er førende og efterfølgende mellemrum signifikante, når man sammenligner strenge byte for byte (dvs. med BINARY ).

For det første er her en strengsammenligning uden indledende eller efterfølgende mellemrum:

SELECT 
    'Cat' = 'Cat',
    BINARY 'Cat' = 'Cat';

Resultat:

+---------------+----------------------+
| 'Cat' = 'Cat' | BINARY 'Cat' = 'Cat' |
+---------------+----------------------+
|             1 |                    1 |
+---------------+----------------------+

Vi får den samme returværdi, uanset om vi bruger BINARY eller ej.

Men her er, hvad der sker, når vi tilføjer efterfølgende mellemrum til en af ​​strengene:

SELECT 
    'Cat' = 'Cat ',
    BINARY 'Cat' = 'Cat ',
    'Cat' = BINARY 'Cat ',
    BINARY 'Cat' = BINARY 'Cat ';

Resultat:

+----------------+-----------------------+-----------------------+------------------------------+
| 'Cat' = 'Cat ' | BINARY 'Cat' = 'Cat ' | 'Cat' = BINARY 'Cat ' | BINARY 'Cat' = BINARY 'Cat ' |
+----------------+-----------------------+-----------------------+------------------------------+
|              1 |                     0 |                     0 |                            0 |
+----------------+-----------------------+-----------------------+------------------------------+

Den første returnerer 1 mens de andre (dvs. dem med BINARY). ) returner 0 .

Bare for at være sikker, lad os sammenligne strenge, der begge har efterfølgende mellemrum:

SELECT
    'Cat ' = BINARY 'Cat ',
    BINARY 'Cat ' = BINARY 'Cat ';

Resultat:

+------------------------+-------------------------------+
| 'Cat ' = BINARY 'Cat ' | BINARY 'Cat ' = BINARY 'Cat ' |
+------------------------+-------------------------------+
|                      1 |                             1 |
+------------------------+-------------------------------+

Husk, at vi kun taler om førende og efterfølgende rum her. Dette koncept gælder ikke for mellemrum i midten af ​​en streng.

For eksempel er to mellemrum i en streng ikke lig med et mellemrum – selv uden brug af BINARY operatør:

SELECT 'Homer Jay' = 'Homer  Jay';

Resultat:

+----------------------------+
| 'Homer Jay' = 'Homer  Jay' |
+----------------------------+
|                          0 |
+----------------------------+

I dette tilfælde indeholder den første streng et mellemrum, og den anden indeholder to mellemrum. Det er nok til, at de er ulige, selv når man bruger et tegn for tegn sammenligning.

Skrivar og bogstaver

Den BINARY operatør fremtvinger en sammenligning, der skelner mellem store og små bogstaver, selvom sorteringen er ufølsom.

For eksempel, her er min forbindelsessamling:

SELECT @@collation_connection;

Resultat:

+------------------------+
| @@collation_connection |
+------------------------+
| utf8_general_ci        |
+------------------------+

ci i slutningen betyder ufølsomme for store og små bogstaver .

Her er et eksempel på en strengsammenligning af store og små bogstaver:

SELECT 
    'cat' = 'CAT',
    BINARY 'cat' = 'CAT';

Resultat:

+---------------+----------------------+
| 'cat' = 'CAT' | BINARY 'cat' = 'CAT' |
+---------------+----------------------+
|             1 |                    0 |
+---------------+----------------------+

Den første sammenligning gav 1, fordi min sortering ikke skelner mellem store og små bogstaver. Den anden returnerede 0 , fordi vi bruger BINARY operatør.

De resultater, du får med sådanne strengsammenligninger (uden BINARY operatør) vil afhænge af din sortering. Brug af en versalfølsom sortering vil returnere det samme resultat, som vi fik med BINARY .

Her er et eksempel til demonstration:

SELECT 
    _latin1'cat' COLLATE latin1_general_ci = 'CAT' AS 'ci',
    _latin1'cat' COLLATE latin1_general_cs = 'CAT' AS 'cs',
    BINARY 'cat' = 'CAT';

Resultat:

+------+------+----------------------+
| ci   | cs   | BINARY 'cat' = 'CAT' |
+------+------+----------------------+
|    1 |    0 |                    0 |
+------+------+----------------------+

Her specificerede jeg eksplicit tegnsættet og sorteringen på strengniveau. Syntaksen for at gøre det lyder sådan her:

[_charset_name]'string' [COLLATE collation_name]

Vi kan se, at den store og små bogstavs-ufølsomme sortering gav et andet resultat end den store og små bogstaver. Og den store og små bogstavsfølsomme sortering returnerede det samme resultat, som vi får ved brug af BINARY operatør.


  1. Sådan bruger du en beregnet kolonne til at beregne en anden kolonne i samme visning

  2. SQL Azure:Database XXXYYY på serveren er ikke tilgængelig i øjeblikket

  3. Hvad er spørgsmålstegnets betydning i MySQL ved kolonnen WHERE =??

  4. cron job til at fjerne gamle data fra postgres på debian