[PHP]Ignorer les accents dans une requête sql

Résolu
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   -  
astuces72 Messages postés 7769 Date d'inscription   Statut Membre Dernière intervention   -
Salut,
J'ai un petit problème avec une requête sql 'select'.
Comme j'ai indiquer dans le titre, je veut que la requête ignore les accents.
Par exemple si quelqu'un tape Telecharger il doit avoir dans les résultats de la requête Telecharger et aussi Télécharger avec des accents .

Merci d'avance


16 réponses

gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
merci mais j'ai déjà effectuer des recherches sur google et ta solution est pour Microsoft SQL Server , moi je travaille sur php alors ma base de donnée est gérer par EasyPhp et non pas sur Microsoft SQL Server .
Y a pas une solution similaire pour EasyPhp ?
Cordialement
1
graffx Messages postés 6506 Date d'inscription   Statut Contributeur Dernière intervention   1 975
 
Il ne faut pas confondre contenant et contenu, sa repnse n' est pas mauvaise.

SQL est un language, easyphp un logiciel.


donc:

SELECT * FROM MY_TABLE WHERE MY_TABLE.STR LIKE '%Libellé%'
COLLATE SQL_Latin1_General_Cp437_CI_AI;

1
jojo673 Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   44
 
0
dam75 Messages postés 1063 Date d'inscription   Statut Webmaster Dernière intervention   67
 
Hello,

Bonne réponse :)

Précisions : sur 99% des instances de MySQL déployées, ce que tu demandes est vrai par défaut :) ... tout cela parce que MySQL, édité à l'origine par une société suédoise, implémente par défaut la collation latin1_swedish_ci, qui se trouve être insensible aux accents !

Attention ceci dit : la collation dépend du "character set", autrement dit si ta table est UTF-8, il faut utiliser une collation adaptée :

SELECT * FROM MY_TABLE WHERE MY_TABLE.STR LIKE '%Libellé%'  
COLLATE utf8_general_ci;


Et si elle est en Latin1 (le cas par défaut, donc le plus courant) :
SELECT * FROM MY_TABLE WHERE MY_TABLE.STR LIKE '%Libellé%'  
COLLATE latin1_swedish_ci;


A noter enfin que si la collation de la table ou de la base ou du serveur par défaut est une de celles-ci, il sera inutile de les préciser dans chacune des requêtes.

Ces 2 collations sont insensibles à la casse et aux accents. Par contre attention, latin1_general_ci est insensible à la casse MAIS sensible aux accents ... les mystères des collations, il y en a beaucoup à dire :)

Pour avoir les collations sensibles aux accents, tu peux utiliser latin1_bin / utf8_bin.

Plus d'infos :
http://dev.mysql.com/doc/refman/5.0/fr/charset-collation-charset.html
http://dev.mysql.com/doc/refman/5.0/fr/charset-defaults.html
http://dev.mysql.com/doc/refman/5.0/fr/charset-collate.html

A+++
0
astuces72 Messages postés 7769 Date d'inscription   Statut Membre Dernière intervention   1 641
 
merci à toi dam75, ton message date, mais les explications claires mon bien aidé
:)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
Salut
Merci pour les informations c'est géniale, mais j'ai un problème avec COLLATE


Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in D:\php\EasyPHP-5.3.8.1\EasyPHP-5.3.8.1\www\21.nov.2011\index.php on line ...
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
ma base est COLLATE utf8_general_ci par défaut
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
voici ma requête
SELECT * FROM forum where forum.tit_suj like '%".$res."%'

elle est sensible aux accents et ma base est COLLATE utf8_general_ci par défaut.
et quand je la modifie en
SELECT * FROM forum where forum.tit_suj like '%".$res."%' COLLATE utf8_general_ci

j'ai une erreur
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in D:\php\EasyPHP-5.3.8.1\EasyPHP-5.3.8.1\www\21.nov.2011\index.php on line ...

y a pas une autre solution?
0
dam75 Messages postés 1063 Date d'inscription   Statut Webmaster Dernière intervention   67
 
Salut,

Si ta base (ta table en fait) est en utf8_general_ci ET que ton champ est bien en character_sert UTF8, tu ne devrais pas avoir besoin de rajouter COLLATE à ta requête, puisque c'est la collation par défaut ...

Pour voir le character set de ta table :
SHOW CREATE TABLE MyTable;

Ca te dira à la fin un truc du genre DEFAULT CHARSET=utf8 : s'il n'y a pas de collate, c'est que tu est déjà en utf8_general_ci ...

Pour voir le character set d'un champ : même commande, mais pour un champ donné, tu pourrais avoir un truc du genre :
...
MyString varchar(32) CHARACTER SET latin1 NOT NULL,
...

S'il y a des incohérences (genre un champ en latin1 dans une table UTF-8, ça peut provoquer des erreurs du type
"Illegal mix of collations ..."

1/ Il faut que tu arrives à voir ces erreurs : dans ce que tu nous montres, ta requête te renvoie FALSE parce qu'il y a eu une erreur, mais il faudrait voir laquelle !
(fonction PHP mysql_error, ou en POO mysqli_handler->error() par exemple)

2/ Si c'est bien un mélange de collations "interdit" : tu peux par exemple écrire ainsi ta requête pour contourner le problème
SELECT * FROM forum where forum.tit_suj COLLATE latin1_swedish_ci like '%".$res."%' COLLATE utf8_general_ci;

... mais le plus propre si tu peux serait de nettoyer ta structure de tables : si TOUT est cohérent (connexion + serveur + base + tables + champs), tu ne devrais jamais avoir ce genre de problèmes :)
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
La table et les champs sont tout en utf8_general_ci , mais toujours la requête prend compte les accents , Bizarre

if (isset($submit)){
$result = mysql_query("SELECT * FROM forum where forum.tit_suj like '%".$res."%' ") ;
while($data= mysql_fetch_array($result)){
echo $data['tit_suj'];
echo "<br>";
}
}
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
ET avec
SELECT * FROM forum where forum.tit_suj COLLATE latin1_swedish_ci like '%".$res."%' COLLATE utf8_general_ci;

j'ai toujours une erreur

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in D:\php\EasyPHP-5.3.8.1\EasyPHP-5.3.8.1\www\21.nov.2011\index.php on line 197
0
dam75 Messages postés 1063 Date d'inscription   Statut Webmaster Dernière intervention   67
 
Comme je te l'ai dit, il faudrait que tu aies l'erreur en question ... là, ce n'est pas possible de savoir ce qui se passe :)
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
L'erreur pointe vers cette ligne:
while($data= mysql_fetch_array($result)){



f (isset($submit)){
$result = mysql_query("SELECT * FROM forum where forum.tit_suj like '%".$res."%' ") ;
while($data= mysql_fetch_array($result)){
echo $data['tit_suj'];
echo "<br>";
}
}
0
Anoen Messages postés 196 Date d'inscription   Statut Membre Dernière intervention   25
 
Ca ressemble à une erreur de requête. Je te suggère de faire ça :
$result = mysql_query("SELECT * FROM forum where forum.tit_suj like '%".$res."%' ") or die(mysql_error()); 
0
jojo673 Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   44
 
Retour à la case départ :)
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
ici
if (isset($submit)){
$result = mysql_query("SELECT * FROM forum where forum.tit_suj like '%".$res."%' COLLATE utf8_general_ci ") or die(mysql_error()) ;
while($data= mysql_fetch_array($result)){
echo $data['tit_suj'];
echo "<br>";
}
}

Erreur
COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'


(la base ,la table et le champ sont en utf8_general_ci
0
jojo673 Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   44
 
Essaye d'ajouter cette ligne avant toute requête :
mysql_query("SET NAMES 'utf8'");
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
j'ai constaté que quand je fait un enregistrement du mot Télécharger par ex, dans la base il devient Télécharger

ok je vais essayer
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
meme dans une requete insert ou update je met
mysql_query("SET NAMES 'utf8'");

car comme ca les accen sont ignoré dans la le select
0
gezaakk Messages postés 382 Date d'inscription   Statut Membre Dernière intervention   34
 
Merci tous a votre aide précieuse

Cordialement
0