Recherche sensible à la casse MYSQL pour le champ bin utf8

j'ai créé une table et placé la collation à utf8 afin de pouvoir ajouter un index unique à un champ. Maintenant, je dois faire des recherches insensibles à la casse, mais quand j'ai effectué quelques requêtes avec le mot clé collate et j'ai obtenu:

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
Erreur

1253 (42000): la COLLATION "utf8_general_ci" n'est pas valable pour Jeu de caractères 'latin1 '

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
ERREUR

1267 (HY000): Mélange illégal de collations (utf8_bin, implicite) et (latin1_general_ci,EXPLICITE) pour l'opération " = '

je suis assez nouveau à SQL, donc je me demandais si quelqu'un pourrait aider.

18
demandé sur JohnB 2009-05-23 11:23:05

4 réponses

une chaîne dans MySQL a un jeu de caractères et une collation . Utf8 est le jeu de caractères, et utf8_bin est l'un de ses classements. Pour comparer votre chaîne literal à une colonne utf8, convertissez-la en utf8 en la préfixant avec la notation _charset:

_utf8 'Something'

maintenant une compilation n'est valable que pour certains jeux de caractères. Le cas- sensible collation pour utf8 semble être utf8_bin, que vous pouvez spécifier comme:

_utf8 'Something' collate utf8_bin

avec ces conversions, la requête devrait fonctionner:

select * from page where pageTitle = _utf8 'Something' collate utf8_bin

le préfixe _charset fonctionne avec des chaînes littérales. Pour changer le jeu de caractères d'un champ, il y a CONVERT ... UTILISER. Ceci est utile lorsque vous souhaitez convertir le champ pageTitle en un autre jeu de caractères, comme dans:

select * from page 
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'

pour voir le caractère et la collation d'une colonne nommée "col" dans une table appelée "TAB", essayez:

select distinct collation(col), charset(col) from TAB

une liste de tous les jeux de caractères et collations peut être trouvée avec:

show character set
show collation

et toutes les collations valides pour utf8 peuvent être trouvées avec:

show collation where charset = 'utf8'
40
répondu Andomar 2012-06-18 03:34:01

veuillez également noter qu'en cas d'utilisation de "Collate utf8_general_ci" ou "Collate latin1_general_ci", c'est - à-dire "forcer" collate-une telle conversion empêchera l'utilisation des index existants! Cela pourrait être un goulot d'étranglement pour les performances.

2
répondu Maksim 2013-05-18 15:38:08

Essayer cela, Son travail pour moi

sélectionner * de users où UPPER ( name ) = Upper ("josé") COLLATE utf8_bin;

2
répondu user3041121 2015-12-23 11:22:39

puis-je vous demander pourquoi vous avez besoin de modifier explicitement la collation lorsque vous faites un SELECT? Pourquoi ne pas simplement collater de la façon dont vous voulez récupérer les dossiers une fois triés?

le problème que vous avez avec vos recherches étant sensible à la casse est que vous avez une collation binaire. Essayez plutôt d'utiliser le classement général. Pour plus d'informations sur la sensibilité des cas et les collations, regardez ici: Sensibilité à la casse dans les Recherches de chaînes

1
répondu PatrikAkerstrand 2009-05-23 07:52:42