2010-12-10 73 views
4

J'ai une base de données où nous stockons les noms d'utilisateur avec une première lettre majuscule de chaque nom - c.-à-d., IsaacSparling. J'essaye de faire autocomplete insensible à la casse contre ma base de données MySQL (v5.1.46). La table a un jeu de caractères de UTF8 et un rassemblement de utf8_unicode_ci. J'ai aussi fait ces tests contre la collation utf8_general_ci.Collation unicode insensible à la casse dans MySQL

texte ASCII fonctionne très bien:

mysql> select username from users where username like 'j%'; 
+----------------+ 
| username  | 
+----------------+ 
| J********  | 
| J*********** | 
| J************* | 
+----------------+ 
3 rows in set (0.00 sec) 

mysql> select username from users where username like 'J%'; 
+----------------+ 
| username  | 
+----------------+ 
| J********  | 
| J*********** | 
| J************* | 
+----------------+ 
3 rows in set (0.00 sec) 

(noms expurgés, mais ils sont là).

Cependant, lorsque je tente de faire la même chose pour les caractères unicode en dehors du jeu ASCII, pas de chance:

mysql> select username from users where username like 'ø%'; 
Empty set (0.00 sec) 


mysql> select username from users where username like 'Ø%'; 
+-------------+ 
| username | 
+-------------+ 
| Ø********* | 
+-------------+ 
1 row in set (0.00 sec) 

Certaines enquête m'a conduit à ceci: http://bugs.mysql.com/bug.php?id=19567 (tl; dr, ceci est une connue bug avec les classements Unicode, et la fixation est à la priorité «nouvelle fonctionnalité» - c'est-à-dire, ne sera pas terminé dans un délai raisonnable).

Est-ce que quelqu'un a découvert des solutions de contournement efficaces qui permettent une recherche insensible à la casse pour les caractères Unicode dans MySQL? Toutes les pensées ont apprécié!

+1

Question intéressante! Pour autant que je comprenne le bug, cela n'a rien à voir avec votre problème? Il semble que ce soit à propos de la sensibilité de l'accent 'a' =>' ' –

+0

Pouvez-vous vérifier si' LOWER (nom d'utilisateur) LIKE 'ø%' 'fonctionne? Il est susceptible d'être soumis au même comportement mais si ce n'est pas le cas, cela peut servir de solution de rechange –

+0

mysql> sélectionnez 1 parmi les utilisateurs où LOWER (nom d'utilisateur) LIKE 'ø%'; Ensemble vide (0,00 sec) Aucun dé. Il semble que la transition de cas pour les caractères Unicode en dehors de l'ensemble Ascii est totalement borked. Merci pour l'idée cependant! – isparling

Répondre

1

fonctionne bien pour moi avec la version 5.1.42-communauté

Peut-être que votre client MySQL n'a pas envoyé les caractères unicode correctement. J'ai testé avec sqlYog et cela a très bien fonctionné avec les collations utf8_unicode_ci et utf8_general_ci

0

Si ce qui vous intéresse c'est de pouvoir ordonner les valeurs du champ par le texte sans se soucier si c'est en majuscule ou en minuscule je pense que la meilleure chose vous pouvez faire est d'adresser le champ au lieu de taper simplement username, tapez LOWER(username) username et alors vous pouvez parfaitement utiliser une commande par ce champ en l'appelant par son nom

0

Avez-vous essayé d'utiliser CONVERT? Quelque chose comme

peut travailler pour vous.

0

Je viens résolu le même problème en utilisant la requête

show variables like '%char%'; 

Mon character_set_client a été réglé sur « UTF8 », mais character_set_connection et character_set_results ont été mis à « latin1 ». Ainsi, les fonctions UPPER, LOWER, LIKE n'ont pas fonctionné comme prévu.

Je viens insérer la ligne

mysql_query("SET NAMES utf8"); 

juste après connexion pour obtenir le travail de recherche sensible à la casse.