Dans MariaDB, le BINARY l'opérateur convertit la chaîne qui le suit en une chaîne binaire.
Le BINARY vous permet de faire une comparaison de colonne octet par octet plutôt que caractère par caractère. Cela rend la comparaison sensible à la casse même si la colonne n'est pas définie comme BINARY ou BLOB . Cela signifie également que les espaces de début/de fin deviennent significatifs.
Exemple
Voici un exemple simple :
SELECT BINARY 'Cat'; Résultat :
+--------------+| BINAIRE 'Chat' |+--------------+| Chat |+--------------+
Cet exemple ne montre pas vraiment comment le BINARY L'opérateur peut affecter les comparaisons de chaînes. Les exemples suivants le font.
Espaces de début/de fin
Comme mentionné, les espaces de début et de fin sont significatifs lors de la comparaison de chaînes octet par octet (c'est-à-dire avec BINARY ).
Tout d'abord, voici une comparaison de chaînes sans espaces de début ou de fin :
SELECT
'Cat' = 'Cat',
BINARY 'Cat' = 'Cat'; Résultat :
+---------------+----------------------+| 'Chat' ='Chat' | BINAIRE 'Chat' ='Chat' |+---------------+----------------------+| 1 | 1 |+---------------+----------------------+
Nous obtenons la même valeur de retour si nous utilisons BINARY ou pas.
Mais voici ce qui se passe lorsque nous ajoutons des espaces à la fin de l'une des chaînes :
SELECT
'Cat' = 'Cat ',
BINARY 'Cat' = 'Cat ',
'Cat' = BINARY 'Cat ',
BINARY 'Cat' = BINARY 'Cat '; Résultat :
+----------------+-----------------------+----- ------------------+------------------------------+ | 'Chat' ='Chat ' | BINAIRE 'Chat' ='Chat ' | 'Chat' =BINAIRE 'Chat ' | BINAIRE 'Chat' =BINAIRE 'Chat ' |+----------------+---------------------- -+-----------------------+------------------------ ------+| 1 | 0 | 0 | 0 |+------------+-----------------------+------ -----------------+------------------------------+Le premier renvoie
1alors que les autres (c'est-à-dire ceux avecBINARY) renvoie0.Juste pour être sûr, comparons les chaînes qui ont toutes deux des espaces à la fin :
SELECT 'Cat ' = BINARY 'Cat ', BINARY 'Cat ' = BINARY 'Cat ';Résultat :
+-----------------------+--------------------- ----------+| 'Chat' =BINAIRE 'Chat' | BINAIRE 'Chat ' =BINAIRE 'Chat ' |+------------------------+-------------- -----------------+| 1 | 1 |+-----------------------+---------------------- ---------+Gardez à l'esprit que nous ne parlons ici que des espaces de début et de fin. Ce concept ne s'applique pas aux espaces au milieu d'une chaîne.
Par exemple, deux espaces dans une chaîne ne sont pas égaux à un espace - même sans utiliser le
BINARYopérateur :SELECT 'Homer Jay' = 'Homer Jay';Résultat :
+----------------------------+| 'Homer Jay' ='Homer Jay' |+----------------------------------------+| 0 |+----------------------------+Dans ce cas, la première chaîne contient un espace et la seconde contient deux espaces. Cela suffit pour qu'ils soient inégaux, même en utilisant une comparaison caractère par caractère.
Sensibilité à la casse
Le
BINARYforce une comparaison sensible à la casse, même si le classement est insensible à la casse.Par exemple, voici mon classement de connexion :
SELECT @@collation_connection;Résultat :
+------------------------+| @@collation_connection |+------------------------+| utf8_general_ci |+-----------------------+Le
cià la fin signifie insensible à la casse .Voici un exemple de comparaison de chaînes de chaînes majuscules et minuscules :
SELECT 'cat' = 'CAT', BINARY 'cat' = 'CAT';Résultat :
+---------------+----------------------+| 'chat' ='CHAT' | BINAIRE 'chat' ='CHAT' |+---------------+----------------------+| 1 | 0 |+---------------+----------------------+La première comparaison a renvoyé 1, car mon classement est insensible à la casse. Le second a renvoyé
0, car nous utilisons leBINARYopérateur.Les résultats que vous obtenez avec de telles comparaisons de chaînes (sans le
BINARYopérateur) dépendra de votre classement. L'utilisation d'un classement sensible à la casse renverra le même résultat que nous avons obtenu avecBINARY.Voici un exemple pour illustrer :
SELECT _latin1'cat' COLLATE latin1_general_ci = 'CAT' AS 'ci', _latin1'cat' COLLATE latin1_general_cs = 'CAT' AS 'cs', BINARY 'cat' = 'CAT';Résultat :
+------+------+----------------------+| ci | cs | BINAIRE 'chat' ='CHAT' |+------+------+----------------------+| 1 | 0 | 0 |+------+------+---------------------+Ici, j'ai explicitement spécifié le jeu de caractères et le classement au niveau de la chaîne. La syntaxe pour faire cela ressemble à ceci :
[_charset_name]'string' [COLLATE collation_name]Nous pouvons voir que le classement insensible à la casse a renvoyé un résultat différent du classement sensible à la casse. Et le classement sensible à la casse a renvoyé le même résultat que celui que nous obtenons lors de l'utilisation du
BINARYopérateur.