IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Select where varchar


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Septembre 2013
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Select where varchar
    Bonjour,

    J'ai un problème avec une requête que je lance depuis Lazarus sur une base MySQL. En simplifiant au maximum et en travaillant uniquement sur la base (avec MySQL Workbench), je pense que c'est juste un problème SQL. C'est trivial et j'ai un peu honte mais si vous pouvez m'aider, ça serait super !

    Allez, je me lance : j'ai une table pays contenant la liste des pays du monde et un identifiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE `pop`.`pays` (
      `nopays` SMALLINT(3) NOT NULL,
      `pays` VARCHAR(42) NULL,
      PRIMARY KEY (`nopays`));
    Je lance la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select pays from pop.pays where nopays=70;
    qui me renvoit
    France
    Maintenant je fais la requête inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nopays from pop.pays where trim(pays)='France';
    et je ne récupère rien !

    Pour info, la base est en utf8

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Septembre 2013
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    J'ai "trouvé" : avant je chargeais la table avec un fichier texte avec une instruction "load data infile".
    En les chargeant "manuellement" avec une instruction "INSERT INTO pays VALUES ..." ça marche. Une petite mise en forme avec excel, un copier coller dans MySQL workbench et ça roule ! Il était temps, je devenais chèvre.
    Je suppose que c'est une histoire de format d'encodage du fichier texte, mais comme ça me fatigue et que surtout ça marche maintenant, je n'ai pas creusé plus loin.

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut plouflacig.

    Plusieurs remarques :

    1) voici la déclarative de votre table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE `pop`.`pays` (
      `nopays` SMALLINT(3) NOT NULL,
      `pays` VARCHAR(42) NULL,
      PRIMARY KEY (`nopays`));
    Vous n'avez pas précisé le charset et le collate.
    Il aurait été plus judicieux de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `pop`.`pays` (
      `nopays` SMALLINT(3) NOT NULL,
      `pays` VARCHAR(42) NULL,
      PRIMARY KEY (`nopays`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      ROW_FORMAT=COMPRESSED;
    J'ai rajouté le moteur InnoDB ainsi que la compression.

    2) comme vous n'avez pas précisé le charset et le collate, MySql ne sait pas si celui qu'il va utiliser sera celui qui est utilisé pour votre base de données.
    Par exemple, vous écrivez "france" sans le f majuscule dans votre table, mais vous demandez à extraire la ligne ayant "France" avec un f majuscule.
    Sans le collate, MySql fera la distinction entre le f majuscule et le f minuscule et de ce fait, vous n'extrayez aucune ligne.
    D'où l'importance d'utiliser un collate : https://dev.mysql.com/doc/refman/5.7...t-collate.html

    3) voici votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nopays from pop.pays where trim(pays)='France';
    Pourquoi utilisez-vous la fonction "trim()" pour supprimer les espaces avant et après la valeur de votre colonne pays ?
    La bonne écriture est de faire ceci : "where pays like "%France%";" si vous désirez supprimer les espaces avant et après.

    4) le problème entre mon écriture et votre écriture est l'usage de l'index qui ne sera pas sargable.
    Autrement dit, votre requête va balayer toute la table. Bonjour la performance !

    5) la bonne écriture de votre requête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nopays from pop.pays where pays = 'France';
    6) vous parlez du chargement de votre fichier Excel dans la table MySql.
    C'est à ce moment là que vous devez utilisez la fonction "trim()" pour supprimer les espaces inutiles, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LOAD DATA LOCAL INFILE 'fichier.txt'
         INTO TABLE `trav`
         CHARACTER SET latin1
         FIELDS TERMINATED            BY ';'
                OPTIONALLY ENCLOSED   BY '\"'
                ESCAPED               BY '\\'
         LINES  TERMINATED            BY '\r\n'
         IGNORE 0 LINES
         (@F1, @F2, @F3)
         set col_num  =             trim(@F1),
             col_date = str_to_date(trim(@F2), '%d/%c/%Y %H:%i:%s'),
             col_char =             trim(@F3);
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Septembre 2013
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci, je suis bien fatigué mais j'ai appris plein de trucs . Le trim c'était juste pour montrer que c'était pas un problème d'espace.
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/05/2006, 09h53
  2. Select ... Where.. NOT IN
    Par backus dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/11/2005, 19h11
  3. SELECT ... WHERE != ???
    Par Terminator dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/05/2005, 21h22
  4. question sur SELECT ...WHERE...IN
    Par danseur dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/01/2004, 15h23
  5. Select * Where {}
    Par Thomad dans le forum Langage SQL
    Réponses: 14
    Dernier message: 16/10/2003, 21h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo