J'ai une fonction qui renvoie cinq caractères avec une casse mixte. Si je fais une requête sur cette chaîne, elle retournera la valeur indépendamment de la casse.
Comment puis-je rendre les requêtes de chaînes MySQL sensibles à la casse?
J'ai une fonction qui renvoie cinq caractères avec une casse mixte. Si je fais une requête sur cette chaîne, elle retournera la valeur indépendamment de la casse.
Comment puis-je rendre les requêtes de chaînes MySQL sensibles à la casse?
Réponses:
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
la source
SELECT 'email' COLLATE utf8_bin = 'Email'
La bonne nouvelle est que si vous avez besoin de faire une requête sensible à la casse, c'est très simple:
la source
convert(char(0x65,0xcc,0x88) using utf8)
(c'est-e
à- dire avec¨
ajouté) etconvert(char(0xc3,0xab) using utf8)
(c'est-à-direë
), mais l'ajoutBINARY
les rendra inégales.Réponse publiée par Craig White, a une grosse pénalité de performance
car il n'utilise pas d'index. Donc, soit vous devez modifier le classement du tableau comme mentionné ici https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html .
OU
Solution la plus simple, vous devez utiliser un BINAIRE de valeur.
Par exemple.
CONTRE
1 rangée en jeu (0,00 sec)
la source
Au lieu d'utiliser l'opérateur =, vous pouvez utiliser LIKE ou LIKE BINARY
Il prendra "A" et non "A" dans son état
la source
Pour utiliser un index avant d'utiliser BINARY, vous pouvez faire quelque chose comme ceci si vous avez de grandes tables.
La sous-requête entraînerait un très petit sous-ensemble insensible à la casse dont vous sélectionnez ensuite la seule correspondance sensible à la casse.
la source
La façon la plus correcte d'effectuer une comparaison de chaînes sensible à la casse sans modifier le classement de la colonne interrogée consiste à spécifier explicitement un jeu de caractères et un classement pour la valeur à laquelle la colonne est comparée.
Pourquoi ne pas utiliser
binary
?L'utilisation de l'
binary
opérateur est déconseillée car elle compare les octets réels des chaînes codées. Si vous comparez les octets réels de deux chaînes codées en utilisant les différents jeux de caractères deux chaînes qui doivent être considérées comme identiques, elles peuvent ne pas être égales. Par exemple, si vous avez une colonne qui utilise lelatin1
jeu de caractères et que votre jeu de caractères de serveur / session l'estutf8mb4
, alors lorsque vous comparez la colonne avec une chaîne contenant un accent tel que «café», elle ne correspondra pas aux lignes contenant la même chaîne! En effet , danslatin1
é est codé comme l'octet0xE9
maisutf8
il est deux octets:0xC3A9
.Pourquoi l'utiliser
convert
aussi biencollate
?Les classements doivent correspondre au jeu de caractères. Donc, si votre serveur ou session est configuré pour utiliser le
latin1
jeu de caractères, vous devez utiliser,collate latin1_bin
mais si votre jeu de caractères est queutf8mb4
vous devez utilisercollate utf8mb4_bin
. Par conséquent, la solution la plus robuste consiste à toujours convertir la valeur dans le jeu de caractères le plus flexible et à utiliser le classement binaire pour ce jeu de caractères.Pourquoi appliquer le
convert
etcollate
à la valeur et non à la colonne?Lorsque vous appliquez une fonction de transformation à une colonne avant d'effectuer une comparaison, cela empêche le moteur de requête d'utiliser un index s'il en existe un pour la colonne, ce qui pourrait considérablement ralentir votre requête. Par conséquent, il est toujours préférable de transformer la valeur à la place lorsque cela est possible. Lorsqu'une comparaison est effectuée entre deux valeurs de chaîne et que l'une d'entre elles a un classement explicitement spécifié, le moteur de requête utilise le classement explicite, quelle que soit la valeur à laquelle il est appliqué.
Sensibilité d'accent
Il est important de noter que MySql est non seulement sensible à la casse pour les colonnes en utilisant un
_ci
assemblage (qui est généralement la valeur par défaut), mais aussi l' accent insensible. Cela veut dire que'é' = 'e'
. L'utilisation d'un classement binaire (ou de l'binary
opérateur) rendra les comparaisons de chaînes sensibles à l'accent ainsi qu'à la casse.Qu'est-ce que c'est
utf8mb4
?Le
utf8
jeu de caractères dans MySql est un aliasutf8mb3
qui a été déprécié dans les versions récentes car il ne prend pas en charge les caractères à 4 octets (ce qui est important pour coder des chaînes comme 🐈). Si vous souhaitez utiliser le codage de caractères UTF8 avec MySql, vous devez utiliser leutf8mb4
jeu de caractères.la source
Ce qui suit est pour les versions de MySQL égales ou supérieures à 5.5.
Ajouter à /etc/mysql/my.cnf
Toutes les autres collations que j'ai essayées ne semblaient pas sensibles à la casse, seul "utf8_bin" fonctionnait.
N'oubliez pas de redémarrer mysql après ceci:
Selon http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html, il existe également un "latin1_bin".
Le "utf8_general_cs" n'a pas été accepté par le démarrage de mysql. (J'ai lu "_cs" comme "sensible à la casse" - ???).
la source
Vous pouvez utiliser BINARY pour respecter la casse comme celui-ci
malheureusement, ce sql ne peut pas utiliser l'index, vous subirez un impact sur les performances des requêtes dépendantes de cet index
Heureusement, j'ai quelques astuces pour résoudre ce problème
la source
Excellent!
Je partage avec vous le code d'une fonction qui compare les mots de passe:
la source
declare pSuccess BINARY;
au débutPas besoin de changer quoi que ce soit au niveau de la base de données, il vous suffit de modifier les requêtes SQL, cela fonctionnera.
Exemple -
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
Le mot-clé binaire rendra la casse sensible.
la source
mysql n'est pas sensible à la casse par défaut, essayez de changer le classement de langue en
latin1_general_cs
la source