Question

J'ai créé une table et définissez le classement à UTF8 afin de pouvoir ajouter un index unique à un champ. Maintenant, je dois faire des recherches cas insensibles, mais quand je fis quelques requêtes avec le mot-clé et je suis collate:

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

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

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

ERROR 1267 (HY000): mélange illégale des classements (utf8_bin, IMPLICIT) et   (Latin1_general_ci, explicit) pour un fonctionnement '='

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

Était-ce utile?

La solution

Chaîne de MySQL a un caractère et une collation . UTF8 est le jeu de caractères et utf8_bin est l'un de ses classements. Pour comparer votre chaîne littérale à une colonne de UTF8, le convertir en UTF8 en préfixant avec la notation _charset:

_utf8 'Something'

Maintenant, une collation est valable uniquement pour certains jeux de caractères. Le Case- sensibles pour la collation UTF8 semble être utf8_bin, que vous pouvez spécifier comme:

_utf8 'Something' collate utf8_bin

Avec ces conversions, la requête doit travailler:

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

Le préfixe _charset travaille avec des chaînes littérales. Pour changer le jeu de caractères d'un champ, il y a ... CONVERT UTILISATION. Ceci est utile lorsque vous souhaitez convertir le champ pageTitle à 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 pour une colonne nommée « col » dans une table appelée « TAB », essayez:

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

Vous trouverez une liste de tous les jeux de caractères et avec les classements:

show character set
show collation

Et tous valides pour UTF8 collations peuvent être trouvés avec:

show collation where charset = 'utf8'

Autres conseils

S'il vous plaît également noter qu'en cas d'utilisation « Triées utf8_general_ci » ou « Triées latin1_general_ci », à savoir « force » collationner - une telle conversion empêchera d'utilisation des index existants! Cela pourrait être un goulot d'étranglement à l'avenir pour la performance.

Essayez ceci, Son travail pour moi

SELECT * FROM users WHERE UPPER (name) = UPPER ( 'josé') collationner utf8_bin;

Puis-je vous demander pourquoi vous avez besoin de changer explicitement le classement lorsque vous faites un SELECT? Pourquoi ne pas rassembler juste la façon dont vous voulez récupérer les enregistrements lorsqu'ils sont triés?

Le problème que vous avez avec vos recherches étant sensibles à 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 casse et les classements, regardez ici: Sensibilité à la casse dans la chaîne Recherches

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top