[mySQL] problème d'accents dans query

Le
Denis Beauregard
Bonjour,

Sur un site que j'ai développé il y a quelques années, je pouvais
faire une recherche telle que si je recherche une lettre accentuée,
mysql trouve la lettre accentuée ou non. Ainsi, la recherche suivante

http://www.sgcf.com/zacharie/reponse.php?Auteurs=b%E9auregard&Titre=&Cote=&Sujet=

où je demande béauregard, va trouver beauregard.

Je suis en train de développer un nouveau site à partir de zéro et
j'ai donc créé une nouvelle base de données et écrit du code
entièrement nouveau. Mais la procédure pour préparer le query est
à peu près la même.

ancienne version : $mot = $_GET puis str_replace pour remplacer * par
%
et l'espace par % puis addslashes et $query = "select etc.

nouvelle version : $mot = valeur("mot") où valeur est cette fonction:

function Valeur ($cible, $def) {
$rep = $def;
if (isset($_POST[$cible])) { $rep =$_POST[$cible]; };
if (isset($_GET[$cible])) { $rep =$_GET[$cible]; };
$rep = str_replace("*","%",$rep);
$rep = str_replace(""","",$rep);
$rep = str_replace(";","",$rep);
$rep = str_replace("?","_",$rep);
return (addslashes($rep));
};

donc, je prends l'argument dans $_GET ou $_POST, je remplace les
* et ? par des équivalents SQL, et j'enlève les et ; pour me
protéger contre des infections de code. Les modifications sont
équivalentes.

Dans les deux cas, le SELECT utilise LIKE pour la comparaison.
Mais dans mon nouveau code, hébert ne trouve pas hebert !

Le champ dans la base SQL est pourtant codé comme
latin1_general_ci dans les deux cas, l'un est text et l'autre
un varchar(36). Dans les deux cas, pas d'énoncé dans l'entête
pour choisir un jeu de caractères.

Quel est le problème de mon nouveau code ?


Denis
Vos réponses Page 3 / 3
Trier par : date / pertinence
SQLpro
Le #21920751
Mickaël Wolff a écrit :
[...]
On
ne peut pas se permettre de générer une requête qui ignorera les index
(comme le fait la plupart du temps une requête utilisant like).



Ll'index sera utilisé si le LIKE est 'toto%', mais pas '%toto'.
Cependant avec des index calculées (fonction) ou des colonnes calculées
indexées (ce qui revient au même) vous pouvez faire un "reverse" de la
colonne et par conséquent faire en sorte que le like '%toto' active l'index.

Enfin pour le cas du LIKE '%toto%' il existe la technique des index
rotatif que j'ai mis au point il y a quelques années...



Mais mon expérience ne se limite qu'à l'usage de deux SGBDR SQL. Je
serais intéressé de confronter mes constatations à celles d'un
utilisateur ou développeur d'une base telle Oracle ou Postgre.




A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Pascal G.
Le #21920741
Bonjour fred


[...]
On ne peut pas se permettre de générer une requête qui ignorera les index
(comme le fait la plupart du temps une requête utilisant like).



Ll'index sera utilisé si le LIKE est 'toto%', mais pas '%toto'.
Cependant avec des index calculées (fonction) ou des colonnes calculées
indexées (ce qui revient au même) vous pouvez faire un "reverse" de la
colonne et par conséquent faire en sorte que le like '%toto' active
l'index.

Enfin pour le cas du LIKE '%toto%' il existe la technique des index
rotatif que j'ai mis au point il y a quelques années...



Tu peux nous en dire un peu plus, ou nous indiquer un lien où tu en parles ?

@+
pascal G (aka paskal,FAQ OE)
helios
Le #21920731
SQLpro a écrit :
Mickaël Wolff a écrit :
[...]
On ne peut pas se permettre de générer une requête qui ignorera les
index (comme le fait la plupart du temps une requête utilisant like).



Ll'index sera utilisé si le LIKE est 'toto%', mais pas '%toto'.
Cependant avec des index calculées (fonction) ou des colonnes calculées
indexées (ce qui revient au même) vous pouvez faire un "reverse" de la
colonne et par conséquent faire en sorte que le like '%toto' active
l'index.

Enfin pour le cas du LIKE '%toto%' il existe la technique des index
rotatif que j'ai mis au point il y a quelques années...






risible



Mais mon expérience ne se limite qu'à l'usage de deux SGBDR SQL. Je
serais intéressé de confronter mes constatations à celles d'un
utilisateur ou développeur d'une base telle Oracle ou Postgre.




A +

Publicité
Poster une réponse
Anonyme