sql >> Database >  >> RDS >> MariaDB

Hoe de BINARY-operator werkt in MariaDB

In MariaDB is de BINARY operator cast de string die erop volgt naar een binaire string.

De BINARY operator stelt u in staat om een ​​kolomvergelijking per byte uit te voeren in plaats van teken voor teken. Dit zorgt ervoor dat de vergelijking hoofdlettergevoelig is, zelfs als de kolom niet is gedefinieerd als BINARY of BLOB . Het betekent ook dat voor- en achterruimten significant worden.

Voorbeeld

Hier is een eenvoudig voorbeeld:

SELECT BINARY 'Cat';

Resultaat:

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

Dit voorbeeld laat niet echt zien hoe de BINARY operator kan stringvergelijkingen beïnvloeden. De volgende voorbeelden doen dat wel.

Leading/Trailing Spaces

Zoals vermeld, zijn voorloop- en volgspaties significant bij het byte voor byte vergelijken van strings (d.w.z. met BINARY ).

Ten eerste, hier is een tekenreeksvergelijking zonder voorloop- of volgspaties:

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

Resultaat:

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

We krijgen dezelfde retourwaarde, of we nu BINARY . gebruiken of niet.

Maar dit is wat er gebeurt als we volgspaties toevoegen aan een van de tekenreeksen:

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

Resultaat:

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

De eerste retourneert 1 terwijl de andere (d.w.z. die met BINARY ) retourneer 0 .

Laten we voor de zekerheid strings vergelijken die beide een volgspatie hebben:

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

Resultaat:

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

Houd er rekening mee dat we het hier alleen hebben over voorloop- en volgspaties. Dit concept is niet van toepassing op spaties in het midden van een tekenreeks.

Twee spaties in een string is bijvoorbeeld niet gelijk aan één spatie – zelfs zonder gebruik van de BINARY operator:

SELECT 'Homer Jay' = 'Homer  Jay';

Resultaat:

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

In dit geval bevat de eerste string één spatie en de tweede twee spaties. Dat is genoeg om ongelijk te hebben, zelfs als je een karakter gebruikt door karakter te vergelijken.

Hoofdlettergevoeligheid

De BINARY operator dwingt een hoofdlettergevoelige vergelijking af, zelfs als de sortering niet hoofdlettergevoelig is.

Dit is bijvoorbeeld mijn verbindingsverzameling:

SELECT @@collation_connection;

Resultaat:

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

De ci aan het einde betekent hoofdlettergevoelig .

Hier is een voorbeeld van een tekenreeksvergelijking van tekenreeksen in hoofdletters en kleine letters:

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

Resultaat:

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

De eerste vergelijking leverde 1 op, omdat mijn sortering niet hoofdlettergevoelig is. De tweede retourneerde 0 , omdat we de BINARY . gebruiken telefoniste.

De resultaten die u krijgt met dergelijke stringvergelijkingen (zonder de BINARY operator) is afhankelijk van uw sortering. Het gebruik van een hoofdlettergevoelige sortering geeft hetzelfde resultaat als met BINARY .

Hier is een voorbeeld om te demonstreren:

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

Resultaat:

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

Hier heb ik expliciet de tekenset en sortering op tekenreeksniveau gespecificeerd. De syntaxis om dat te doen gaat als volgt:

[_charset_name]'string' [COLLATE collation_name]

We kunnen zien dat de hoofdletterongevoelige sortering een ander resultaat opleverde dan de hoofdlettergevoelige sortering. En de hoofdlettergevoelige sortering leverde hetzelfde resultaat op als bij het gebruik van de BINARY telefoniste.


  1. pgadmin4:er kan geen verbinding worden gemaakt met de postgresql-toepassingsserver.

  2. Een gekoppelde SQL-server opvragen

  3. INSERT ... OP DUPLICATE KEY UPDATE met WAAR?

  4. Kun je een webservice aanroepen vanuit TSQL-code?