web-dev-qa-db-fra.com

Comment effectuer une recherche Accent Sensitive dans MySql

J'ai une table MySQL avec utf8 général ci collation. Dans le tableau, je peux voir deux entrées:

un mauvais
un mauvais

J'utilise une requête qui ressemble à ceci:

SELECT *  FROM `words` WHERE `Word` = 'abád'

Le résultat de la requête donne les deux mots:

un mauvais
un mauvais

Est-il possible d'indiquer que je veux seulement que MySQL trouve le mot accentué? Je veux que la requête ne retourne que 

un mauvais 

J'ai aussi essayé cette requête:

SELECT *  FROM `words` WHERE BINARY `Word` = 'abád'

Cela ne me donne aucun résultat. Merci pour l'aide.

57
Chris

Si vos recherches sur ce champ vont toujours être sensibles à l’accent, déclarez alors le classement du champ comme étant utf8_bin (qui comparera pour égalité les octets codés par utf8) ou utilisez un classement spécifique au langage faisant la distinction entre le personnages accentués. 

col_name varchar(10) collate utf8_bin

Si les recherches sont normalement insensibles aux accents, mais que vous souhaitez créer une exception pour cette recherche, essayez;

WHERE col_name = 'abád' collate utf8_bin
81
user8599

Dans ma version (MySql 5.0), aucun assemblage de jeux de caractères utf8 n'est disponible pour les recherches sensibles à la casse et aux accents. Le seul assemblage sensible aux accents pour utf8 est utf8_bin. Cependant, il est également sensible à la casse.

Mon travail a consisté à utiliser quelque chose comme ceci:

SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
11
David

Le bogue MySQL, pour référence future, est http://bugs.mysql.com/bug.php?id=19567 .

3
colan

J'avais la même erreur.

J'ai changé le classement de ma table en utf8_bin (via phpMyAdmin) et le problème a été résolu.

J'espère que ça aide! :)

1
Silvio Delgado

Vérifiez si le type de classement de la table de base de données se termine par "_ci". Cela signifie que la casse est respectée ...

Changez-le en collant le même nom ou le nom le plus proche sans le "_ci" ...

Par exemple ... changez "utf8_general_ci" en "utf8_bin" Mke

1
Mike

La réponse acceptée est bonne, mais sachez que vous devrez peut-être utiliser COLLATE utf8mb4_bin à la place!

WHERE col_name = 'abád' collate utf8mb4_bin

Ci-dessus corrige des erreurs comme:

MySQL a déclaré: La documentation 1253 - COLLATION 'utf8_bin' n'est pas valide pour CARACTERE SET 'utf8mb4'

0
Robert Sinclair

Eh bien, vous venez de décrire l’utilité de la collation utf8_general_ci (a, á, à, â, ä, å, tous égaux à a en comparaison).

Des modifications ont également été apportées au serveur MySQL 5.1 en ce qui concerne utf8_general_ci et utf8_unicode_ci, de sorte que la version du serveur dépend également. Mieux vérifier les docs.

Donc, s'il s'agit du serveur MySQL 5.0, je choisirais utf8_unicode_ci au lieu de utf8_general_ci, ce qui est manifestement faux pour votre cas d'utilisation.

0
Tonci Grgin
SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS 

(ou votre classement incluant cs)

0
cjk

Vous pouvez essayer de rechercher la variable hexadécimale du caractère HEX () dans mysql et utiliser une fonction similaire dans votre langage de programmation et la faire correspondre. Cela a bien fonctionné pour moi lorsque je faisais une liste dans laquelle une personne pouvait sélectionner la première lettre d'une personne.

0
Ólafur Waage

Cela fonctionne pour moi pour une recherche insensible à la casse et insensible à la casse dans MySql server 5.1 dans une base de données dans utf8_general_ci, où column est un LONGBLOB.

select * from words where '%Word%' LIKE column collate utf8_unicode_ci

avec 

select * from words where'%Word%' LIKE column collate utf8_general_ci

le résultat est sensible à la casse mais pas sensible à l'accent.

0
Mónica Cifuentes