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

PHP & Base de données Discussion :

requete sql avec ou sans accent


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut requete sql avec ou sans accent
    Bonjour à tous,

    Site : charset=iso-8859-1
    Base de données : latin1_swedish_ci.

    Je cherche à faire la requête suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT id FROM $matable WHERE mot LIKE '%ecreter%' COLLATE ...

    J'ai lu beaucoup de chose à ce sujet, mais je ne dois pas tout comprendre.

    Lorsque je suis les conseils de ce site : http://johannes-fetz.blogspot.fr/200...ents-avec.html je devrais utiliser SQL_Latin1_General_Cp437_CI_AI après collate ... mais j'ai le message suivant : Unknown collation: 'SQL_Latin1_General_Cp437_CI_AI' ????

    Mon but est de, par exemple, trouver le mot écrêter dans la base même si la recherche est avec le mot "ecreter" ou "écreter" ...

    D'avance, merci de m'aider à comprendre pourquoi ça ne marche pas chez moi ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Parce que l'article que tu cites parle de SQL Server et que visiblement tu utilises Mysql.

    L'interclassement que tu veux est plutôt "latin_general_ci".

    Attention il y a un interclassement sur la table et sur les colonnes également.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    merci sabotage pour ta réponse, je n'avais remarqué que c'était SQL Server

    Mais si j'utilise "latin_general_ci" j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown collation: 'latin_general_ci'
    Tout est en "latin1_swedish_ci", tables et colonnes

    Que faire ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu dois faire une faute dans ta requête.
    Utilise phpmyadmin pour ce genre d'opérations, ça évite les erreurs bêtes.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    une faute ?
    voici ma requete
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT id, title FROM matable WHERE (title LIKE '%ecreter%' COLLATE latin_general_ci)
    ??

    J'utilise phpmyadmin, mais pourquoi me recommandes-tu ça ??
    C'est grâce à phpmyadmin que je sais que mes tables sont en latin1_swedish_ci

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    et si je fais la requete avec latin1_swedish_ci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT id, title FROM matable WHERE (title LIKE '%ecreter%' COLLATE latin1_swedish_ci)

    le mot "écrêter" n'est pas trouvé

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce que je voulais dire c'est qu'il faut mettre le bon interclassement sur tes colonnes plutôt que de le faire dans la requête.
    Dans phpmyadmin tu auras du voir que c'est "Latin1_general_ci"

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    tu es un génie sabotage

    Merci infiniment, j'aurai mis 10 ans à trouver ça tout seul

    Bon week-end à toi

    Cyril

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    gloups, je me permets de réouvrir le post, je parviens à trouver le mot rechercher avec accent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT id, title FROM matable WHERE (title LIKE '%écrêter%' COLLATE latin1_general_ci)
    la requete trouve bien le mot écrêtre
    mais si ma requete est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT id, title FROM matable WHERE (title LIKE '%ecreter%' COLLATE latin1_general_ci)
    alors je ne trouve pas le mot écrêter ??? je voudrais vraiment que le mot écrêter soit trouvé même si on ne tape pas les accents ...

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu es encore avec "swedish"

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    non, c'est juste une erreur dans le thread
    latin1_general_ci c'est ok normalement ?

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est bête à dire maintenant mais j'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 'écrêter'  LIKE 'ecreter' COLLATE latin1_swedish_ci
    // VRAI
     
    SELECT 'écrêter'  LIKE 'ecreter' COLLATE latin1_general_ci
    // FAUX
    c'est donc latin1_swedish_ci qu'il te faut.

    si on reprend notre discussion, ce n'est pas si évident que ça fonctionne chez toi ; il serait interessant que tu regardes le résultat de ces deux requêtes.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    ... autre point à vérifier : les données sont enregistrées normalement en bdd ? Je veux dire que si elles ont été enregistrées par exemple avec htmlentities, la recherche qui ne tient pas compte das accents ne pourrait pas fonctionner...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    Directement via phpmyadmin j'ai testé les 2 requêtes que tu me proposes (dans matable)

    matable est complètement en latin1_general_ci :
    SELECT 'écrêter' LIKE 'ecreter' COLLATE latin1_general_ci
    j'obtiens ce message :
    #1253 - COLLATION 'latin1_general_ci' is not valid for CHARACTER SET 'utf8'
    matable est complètement en latin1_swedish_ci, j'obtiens ce message :
    SELECT 'écrêter' LIKE 'ecreter' COLLATE latin1_swedish_ci
    même punition
    #1253 - COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'
    Ai-je fais ce qu'il fallait pour tester ce que tu souhaitais sabotage ?
    Je ne pensais pas que ma database était en utf8 ???
    En tout cas, mon code est en iso-8859-1 et les fichiers, général dans eclipse, son par défaut en Cp1252

    ABCIWEB, mes données ne sont pas enregistré avec htmlentities

    je dois avouer que maintenant, je suis paumé !!!

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans phpmyadmin, change provisoirement le mode de connexion en latin1 (ca se passe sur la page d'accueil) pour le test.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    j'ai exactement le même résultat que toi

    pour rappel, AVEC MON CODE, si tout est en latin1_swedish_ci et si je tape "LIKE '%écrêter%'" :
    - ma requete ne me renvoie rien

    Si je passe ma database est en latin1_general_ci et si je recherche "LIKE '%écrêter%'"
    - ma requete me retourne correctement le mot écrêter

    Si je recherche "LIKE '%ecreter%'"
    - ma requete ne me retourne pas "écrêter"

    !!

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux nous fournir un dump de ta base ?

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Sinon petite réflexion complémentaire, c'est indispensable le charset iso-8859-1 ? Parce que si c'est un nouveau site et tant qu'à se prendre la tête sur des problème d'encodage il serait plus indiqué d'utiliser le charset utf-8.
    Nombre de fonctions php comme json_encode ne sont compatibles qu'avec le charset utf-8, sans compter la plupart des modules externes qui pourront communiquer avec php, une lib comme jquery par exemple, etc. Bref utiliser l'iso-8859-1 c'est clairement pas une solution d'avenir...

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    je ne peux envoyer un dump de la base, mais j'en ai refait une simplifiée

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    -- phpMyAdmin SQL Dump
    -- version 4.0.4.1
    -- http://www.phpmyadmin.net
    --
    -- Client: 127.0.0.1
    -- Généré le: Dim 24 Novembre 2013 à 18:33
    -- Version du serveur: 5.6.11
    -- Version de PHP: 5.5.3
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    --
    -- Base de données: `test`
    --
    CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    USE `test`;
     
    DELIMITER $$
    --
    -- Procédures
    --
    CREATE DEFINER=`root`@`localhost` PROCEDURE `test_multi_sets`()
        DETERMINISTIC
    begin
            select user() as first_col;
            select user() as first_col, now() as second_col;
            select user() as first_col, now() as second_col, now() as third_col;
            end$$
     
    DELIMITER ;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `table1`
    --
     
    CREATE TABLE IF NOT EXISTS `table1` (
      `t_id` int(11) NOT NULL AUTO_INCREMENT,
      `t_name` varchar(150) COLLATE latin1_general_ci NOT NULL,
      PRIMARY KEY (`t_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;
     
    --
    -- Contenu de la table `table1`
    --
     
    INSERT INTO `table1` (`t_id`, `t_name`) VALUES
    (1, 'écrêter'),
    (2, 'toto'),
    (3, 'titi');
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;



    et le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	$db = mysql_connect($sql_serveur, $sql_user, $sql_pass) or die ("Could not connect to mysql server");
    	if (!mysql_select_db($db_argil_music, $db)) {echo 'Database connection failed'; exit;}
     
    	//$rq = "SELECT 'écrêter' LIKE 'écrêter' COLLATE latin1_swedish_ci";
    	$rq = "SELECT * FROM table1 WHERE t_name LIKE '%écrêter%' COLLATE latin1_general_ci";
    	//$rq = "SELECT * FROM table1 WHERE t_name LIKE '%toto%' COLLATE latin1_general_ci";
    	$rs = mysql_query($rq, $db) or die(mysql_error());
     
    	while($data = mysql_fetch_assoc($rs)){
    		echo "=> ".$data['t_name'];
       }
    J'ai lu ce que tu dis ABCIWEB sur d'autres forum, mais si j'en suis venu à poser la question c'est justement parce que j'aimerais éviter de tout convertir en utf8.
    En fait, je crains de devoir tout re-tester, les formulaires, tous les $_POST, $_GET et surtout, j'écris des données dans des fichiers ... si les accents ne suivent pas ... alors j'aimerais trouver une solution sans tout convertir, non ?? ou est-ce que je me trompe et je dois tout convertir ?

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    petit complément d'information, pour vous évitez de perdre du temps, lorsque je convertis mon code en swedish dans ma base, alors le mot "écrêter" est correctement trouvé par ma requête.

    Je me demande donc pourquoi ce code de test fonctionne très bien, alors et non sur mon site

    je n'ai même pas besoin d'ajouter de COLLATE !!!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requete SQL avec Rand()
    Par leloup84 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/02/2006, 16h41
  2. requete SQL avec valeur max
    Par oeil de nuit dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2006, 08h58
  3. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  4. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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