2010-03-05 6 views
11

J'essaie d'obtenir un tri accentué et insensible à la casse dans MySQL. En suivant les instructions du manuel, ceci est supposé fonctionner avec le jeu de caractères utf8 et le collationnement utf8_general_ci.Tri sélectif sans accent dans MySQL

Quand je suis l'exemple dans le manuel (http://dev.mysql.com/doc/refman/5.1/en/charset-collation-implementations.html) sous la rubrique « Les classements pour caractères multi-octets Unicode jeux » Je ne reçois pas les mêmes résultats:

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 679877 
Server version: 5.1.41-log MySQL Community Server (GPL) by Remi 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT 'a' = 'A', 'a' = 'À', 'a' = 'á'; 
+-----------+-----------+-----------+ 
| 'a' = 'A' | 'a' = 'À' | 'a' = 'á' | 
+-----------+-----------+-----------+ 
|   1 |   0 |   0 | 
+-----------+-----------+-----------+ 
1 row in set (0.00 sec) 

mysql> 

Dans l'exemple dans le manuel, ceux-ci sont Tout 1.

Il ne parvient pas non plus à traiter les caractères accentués lorsque j'essaie de définir le classement directement dans une requête. Dans cet exemple, la table utilise latin1 et je convertis en utf8.

mysql> select * from test; 
+----------+ 
| k  | 
+----------+ 
| Cárdenas | 
| Cardozo | 
| Corbin | 
| Cabrero | 
+----------+ 

mysql> select k from test order by convert(k using utf8) collate utf8_general_ci 
; 
+----------+ 
| k  | 
+----------+ 
| Cabrero | 
| Cardozo | 
| Corbin | 
| Cárdenas | 
+----------+ 
4 rows in set (0.00 sec) 

Il faut ignorer l'accent sur le 'a' dans la dernière entrée et le trier en second. Des idées de ce que je fais mal?

+0

voulez-vous s'il vous plaît ajouter à votre question la sortie de SHOW FULL COLUMNS FROM test, ' –

+1

je reçois tous les 1 pour la sélectionnez, donc il doit y avoir quelque chose de mal avec vos classements dans MySQL. –

+1

La console sur laquelle vous tapez tous ces tests est-elle configurée pour gérer les entrées au clavier en UTF-8? –

Répondre

0

je pourrais manquer quelque chose ici ... mais tu ne peux pas faire une fonction (par exemple removeAccents) qui prend une chaîne et renvoie la chaîne équivalente non accent, et puis trier par removeAccents(field). Je crois que vous pouvez créer un index pour cela aussi, ce qui devrait aider avec la performance.

2

Cela fonctionne sur mon installation MySQL par défaut. Comme vous n'avez pas fourni de SHOW FULL COLUMNS à partir du test (commentaire @fsb), il est toujours possible que le classement de votre structure de table soit incorrect.

  • Le classement de la colonne 'k' est-il différent de utf8_general_ci?

  • Vérifiez si SELECT k de noms ORDER BY k ASC donne la bonne réponse

  • Est-ce que le fichier d'installation Index.xml MySQL été modifiée pour changer le sens de utf8_general_ci?

partie pertinente de mon installation à titre de comparaison:

<charset name="utf8"> 
    <family>Unicode</family> 
    <description>UTF-8 Unicode</description> 
    <alias>utf-8</alias> 
    <collation name="utf8_general_ci" id="33"> 
    <flag>primary</flag> 
    <flag>compiled</flag> 
    </collation> 
    <collation name="utf8_bin" id="83"> 
    <flag>binary</flag> 
    <flag>compiled</flag> 
    </collation> 
</charset> 
  • a le code compilé été modifié pour changer le sens de utf8_general_ci?

On peut imaginer que quelqu'un d'autre a peaufiné une de ces choses dans un but malfaisant ...