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

Résolu/Fermé
gezaakk Messages postés 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 - 22 nov. 2011 à 14:37
astuces72 Messages postés 7723 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 22 avril 2024 - 27 juin 2015 à 00:11
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


A voir également:

16 réponses

gezaakk Messages postés 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
22 nov. 2011 à 20:19
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 jeudi 22 mars 2007 Statut Contributeur Dernière intervention 24 mars 2019 1 973
22 nov. 2011 à 20:59
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 lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
22 nov. 2011 à 15:34
0
dam75 Messages postés 1043 Date d'inscription lundi 4 mai 2009 Statut Webmaster Dernière intervention 21 février 2023 67
Modifié par dam75 le 22/11/2011 à 21:39
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 7723 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 22 avril 2024 1 637
27 juin 2015 à 00:11
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
22 nov. 2011 à 23:15
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
22 nov. 2011 à 23:36
ma base est COLLATE utf8_general_ci par défaut
0
gezaakk Messages postés 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
22 nov. 2011 à 23:59
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 1043 Date d'inscription lundi 4 mai 2009 Statut Webmaster Dernière intervention 21 février 2023 67
23 nov. 2011 à 10:02
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
23 nov. 2011 à 13:29
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
23 nov. 2011 à 13:40
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 1043 Date d'inscription lundi 4 mai 2009 Statut Webmaster Dernière intervention 21 février 2023 67
23 nov. 2011 à 18:06
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
23 nov. 2011 à 20:19
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 mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
24 nov. 2011 à 00:34
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 lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
24 nov. 2011 à 09:09
Retour à la case départ :)
0
gezaakk Messages postés 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
24 nov. 2011 à 09:15
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 lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
24 nov. 2011 à 09:19
Essaye d'ajouter cette ligne avant toute requête :
mysql_query("SET NAMES 'utf8'");
0
gezaakk Messages postés 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
24 nov. 2011 à 09:22
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
24 nov. 2011 à 09:28
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 380 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 26 mai 2015 34
24 nov. 2011 à 15:03
Merci tous a votre aide précieuse

Cordialement
0