anomalie de requête SELECT sur un mot à caractère accentué

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : anomalie de requête SELECT sur un mot à caractère accentué

Re: anomalie de requête SELECT sur un mot à caractère accentué

par Aureusms » 01 déc. 2016, 23:17

Tu peux choisir l'interclassement dans ta requête Mysql via COLLATE (http://dev.mysql.com/doc/refman/5.7/en/ ... llate.html).
Si tu choisis un interclassement insensible à la casse comme latin1_swedish_ci, il fera le distinguo entre les lettres accentuées et les autres. Si tu prends utf8_bin, il intégrera toutes les lettres même les accentuées.

Re: anomalie de requête SELECT sur un mot à caractère accentué

par claude99 » 01 déc. 2016, 22:45

Merci pour cette documentation abondante. Si j'ai bien compris (mais pas sûr), il faut changer l'interclassement au niveau du php.ini sur le serveur. Je ne comprends pas pourquoi avec l'utf8, ce n'est pas par défaut l'interclassement bin comme avec l'iso car on peut agir au nvieau de la requête SQL pour élargir la recherche, mais pas pour la réduire. Mais bon, je n'ai sans doute pas bien compris le truc.

Re: anomalie de requête SELECT sur un mot à caractère accentué

par ynx » 01 déc. 2016, 17:20

Salut,

La prise en compte des accents et/ou majuscules dans les requêtes sql dépend de la collation (appelé aussi interclassement) utilisée :
Toutes les collations ont un nom qui commence par le jeu de caractère auquel elles sont liées, et se terminent par l'une de ces trois abréviations :

_bin comme binary : les caractères sont dans l'ordre de leurs numéros de code (ce qui donne d'abord toutes les majuscules, puis toutes les minuscules, puis les lettres accentuées, en vrac).
_cs comme case sensitive : les caractères sont triés selon le ou les langages de référence, mais de manière sensible à la casse.
_ci comme case insensitive : idem, mais en ignorant la casse.
Source : http://fluxbb.fr/aide/doku.php?id=mysql ... _collation

Il semble donc que tu dois utiliser la collation utf8_bin pour prendre en compte les accents.

Bonne journée,

anomalie de requête SELECT sur un mot à caractère accentué

par claude99 » 01 déc. 2016, 11:06

Bonjour à tous,

J'ai crée la table suivante avec 3 enregistrements en utilisant une connexion PDO sans indication de mode charset, j'obtiens sur PHPMyAdmin:

ARTICLE TYPE
pomme fruit
rose fleur
rosé vin

C'est normal puisque j'ai inséré sans charset
Si je fais la requête suivante:

Code : Tout sélectionner

$article="rosé"; $query="SELECT * FROM essai WHERE article='$article';"; $res=$bdd->query($query); while ($ligne=$res->fetch()) { $article=$ligne['article']; $type=$ligne['type']; echo "<br>",$article," ",$type; }
j'obtiens rosé vin
Donc, c'est correct comme résultat

Si maintenant je crée une table identique avec une connexion PDO comportant un charset utf8, j'obtiens sur PHPMyAdmin:

ARTICLE TYPE
pomme fruit
rose fleur
rosé vin

C'est normal puisque j'ai inséré avec charset utf8

Mais si j'effectue la requête précédente SELECT sur la nouvelle table
j'obtiens le résultat anormal:

rose fleur
rosé vin

c'est-à-dire que la requête n'a pas permis de distinguer le e et le é
Comment remédier à cela?