2009-06-15 8 views
1

J'ai le problème suivant (en utilisant mysql 5.0.70).requête mysql avec comme% ..% dans la clause where retournant des résultats différents

Dans un tableau I ont un champ varchar contenant une sorte d'un certain nombre, comme:

"0303A342", "21534463", "35663CE3" 

etc. Collation est réglé sur utf8_general_ci.

Le problème apparaît lorsqu'un utilisateur du système tente de rechercher un enregistrement contenant une partie de ce numéro. requête SQL ressemble

... 
WHERE 'number' LIKE '%0303A%' 

Maintenant, si le « A » dans la partie LIKE est entré comme Latin A, le résultat ne contient que des enregistrements avec Latin A qui est en eux - comme il se doit. Et quand le A est Cyrillic, les résultats sont à nouveau seulement les lignes contenant le Cyrillic A. Il y a beaucoup d'autres lettres comme E, C, B, T et ainsi de suite. Maintenant, ma question est, s'il y a un moyen de modifier ma requête SQL afin qu'il renvoie toutes les lignes correspondant à la partie LIKE '%0303A%' mais pour tout type de A là-dedans? Ou je devrais convertir l'entrée de l'utilisateur avant d'insérer/mettre à jour la base de données?

Répondre

1

Vous devez convertir l'entrée d'utilisateur, il n'y a pas de fonction LOOKS LIKE dans MySQL :)

Vous pouvez stocker la chaîne transcrite avec l'original et utiliser php::translit pour ce faire:

 
id data trans_data 
1 Москва MOSKVA 
2 София SOFIA 
SELECT * 
FROM table 
WHERE trans_data LIKE CONCAT('%', ?, '%') 

mysqli->bind_param('s', strtoupper(transliterate('Москва'))); 
+0

oui, "LOOKS LIKE" est exactement ce que je cherche :) – mmartinov

0

Le fait que certaines lettres se ressemblent dans plusieurs alphabets ne les rend pas identiques. En fait, leur ressemblance peut même dépendre de la police utilisée pour les afficher.

Vos données d'exemple ressemblent à des valeurs hexadécimales. Sans en savoir plus sur le contexte de votre problème, pourrait-il être possible que l'utilisateur entre les données au format décimal (en utilisant simplement les chiffres)? Une autre possibilité pourrait être un contrôle personnalisé pour entrer les critères de recherche. Est-ce que cela doit être du texte libre ou est-ce qu'une liste avec plusieurs options suffirait? Si ce n'est pas le cas, vous pourriez trouver des fonctions similaires à celles décrites par Quassnoi (transliterate()) dans la langue ou la bibliothèque que vous utilisez. Avec MySQL, vous n'avez probablement pas de chance. Et même si vous trouvez une fonction qui fait ce que vous voulez, assurez-vous qu'elle prend en charge tous les langages/alphabets que vos utilisateurs vont utiliser - je ne connais pas le nombre d'alphabets qui ont des mappages 1: 1 de leurs caractères à les latins.

+0

Les données sont juste une chaîne contenant des chiffres, des lettres et même quelques tirets peut-être. Rien de tel que des valeurs hexadécimales ou une autre structure. – mmartinov

0

Je ne peux pas utiliser le translit php - les données auxquelles j'ai affaire (les 'numéros' comme je les appelle) sont une sorte d'identifiants, donc ça n'a pas de sens de chercher "IA" si quelqu'un entre "Я". Parce que je sais que mes utilisateurs n'utiliseront que des caractères latins et cyrilliques, ce que je vais faire est de faire une liste des lettres communes dans les deux alphabets et de convertir l'entrée utilisateur avant d'atteindre la base de données. Sorte de suce mais semble la solution la plus appropriée.

Questions connexes