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 :

LIKE / insensible à la casse et aux accents


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut LIKE / insensible à la casse et aux accents
    Bonjour,

    0/ Config :
    MySQL 5.1.30
    INNODB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT @@character_set_server, @@collation_server;  
    => utf8, utf8_general_ci
     
    SELECT @@character_set_database; 
    => utf8
     
    SHOW FULL COLUMNS FROM MA_TABLE; 
    Tous les champs "texte" sont en varchar(XX) et  utf8_general_ci
    1/ Questions :

    -A- J'ai lu qu'avec l'utf8 le varchar était préférable ?
    Ai je mal compris ?

    -B- Expr à trouver dans CLi_INTIT de MA_TABLE : LOOÏ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CLI_INTIT FROM MA_TABLE WHERE CLI_INTIT LIKE '%looÏ%' =>ok
    SELECT CLI_INTIT FROM MA_TABLE WHERE CLI_INTIT LIKE '%LOOÏ%' =>ok
     
    SELECT CLI_INTIT FROM MA_TABLE WHERE CLI_INTIT LIKE '%looi%' => not ok
    SELECT CLI_INTIT FROM MA_TABLE WHERE CLI_INTIT LIKE '%looï%' => not ok
    J'ai l'impression que c'est les param de la conn client qui mettent le binz

    -C- Test selon doc ANTOUN :
    Requete Via ASP VBScript
    DRIVER={MySQL ODBC 3.51 Driver};
    SQLStr = formate les chaines (' => '')
    sKW = mot clef à rechercher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sSQL="SELECT 
    CHARSET(CLI_INTIT) AS T1, COLLATION(CLI_INTIT) AS T2, 
    CHARSET(" & SQLStr(sKW) & " ) AS T3, 
    COLLATION(" & SQLStr(sKW) & " ) AS T4 
    FROM MA_TABLE LIMIT 1 ;"
    J'ai :
    T1=utf8
    T2=utf8_general_ci
    T3=latin1
    T4=latin1_swedish_ci

    A mon avis, ça vient de l'ASP :
    Response.Charset="utf-8"
    Session.LCID=1033

    Comment faire pour passer de T3=latin1, T4=latin1_swedish_ci
    vers T1=utf8, T2=utf8_general_ci ?

    ----------------------
    J'en perds mon latin1
    Pourriez vous m'aider svp ?
    Merci
    Samish, rentier et futur retraité
    Padawan #7896358

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Voir du côté de la clauseCOLLATE et par la même occasion dans tout le chapitre 10.3 de la doc MySQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Alut,

    1/ Merci de votre aide

    2/ Vous pensez bien que la doc je me la suis tapée !
    point 10.3.8 de la doc => pas de like

    3/ Avec : (cf doc ANTOUN)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND CLI_INTIT LIKE '%noo%' COLLATE utf8_general_ci
    J'ai :
    MySQL][ODBC 3.51 Driver][mysqld-5.1.30-community]COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

    Any Idea ?
    Samish, rentier et futur retraité
    Padawan #7896358

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par Samish Voir le message
    1/J'ai lu qu'avec l'utf8 le varchar était préférable ?
    de mémoire, oui, parce que de toute façon le nombre d'octets est variable quand bien même le nombre de caractères serait fixe.
    Citation Envoyé par Samish Voir le message
    COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
    Le gag est que ton client envoie les requêtes, et donc ton critère, en latin1, auquel tu ne peux donc pas appliquer une collation utf8... Peux-tu essayer comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CLI_INTIT LIKE CONVERT('%looi%' USING utf8)
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Alut,

    @@character_set_system=utf8
    @@character_set_server=utf8
    @@collation_server=utf8_general_ci
    @@character_set_database=utf8

    @@character_set_connection=latin1
    @@collation_connection=latin1_swedish_ci
    @@character_set_results=latin1

    C'est une belle bouillie entre le server et le client.

    1/J'ai bien préciser dans le code :

    --ASP :
    Response.Charset="utf-8"
    'Session.LCID=1033
    1033 =US C pas bon !!!, commenté aucun resultat,
    impossible de trouver un Session.LCID pour utf8 et le codepage 65001
    n'est pas reconnu sur mon serveur de dév !

    --HTML :
    <!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="FR" lang="FR">

    <meta http-equiv="content-type" content="text/html; charset=UTF-8 " />

    2/ J'ai tenté le SET NAMES utf8; (p11/23 de ta doc)
    => là la requête est ok, mais l'affichage des résultats est corrompu

    Je crois que si je n'ai pas de solution via SQL, je vais revoir
    et tester complétement le systéme d'encodage des pages.

    Any Idea ?
    Thx
    Samish
    Samish, rentier et futur retraité
    Padawan #7896358

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Entretemps, j'ai mieux lu ton premier message et modifié le mien... réponse ci-dessus.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    ok, merci mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CLI_INTIT LIKE CONVERT('%looi%' USING utf8)
    Ne fonctionne pas.


    J'ai pas compris le "réponse ci-dessus" -désolé-.
    Samish, rentier et futur retraité
    Padawan #7896358

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    ça ne fonctionne pas comment ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Code : 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
    AND CLI_INTIT LIKE CONVERT('%loo%' USING utf8) 
    => OK
     
    AND CLI_INTIT LIKE CONVERT('%LOOÏ%' USING utf8) 
    => OK
     
    AND CLI_INTIT LIKE CONVERT('%LOOI%' USING utf8) 
    => NOT OK
     
    CLI_INTIT LIKE CONVERT('%looi%' USING utf8) 
    => NOT OK
     
    AND CLI_INTIT LIKE CONVERT('%looï%' USING utf8) 
    => NOT OK
     
    AND CLI_INTIT LIKE CONVERT('%looÏ%' USING utf8) 
    => OK
    Le pb vient "juste" du char spécial
    Et comme il va y avoir une version russe, chinoise....

    Merci de ton aide, si t'as une idée, n'hésites pas
    Samish, rentier et futur retraité
    Padawan #7896358

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    J'ai testé avec phpMyAdmin, et le CLI_INTIT LIKE CONVERT('%LOOI%' USING utf8) retrouve bien "LOOÏ"... J'imagine que c'est effectivement l'ODBC qui fout la merde... (ou alors c'est une différence entre la 5.0 et la 5.1).

    Quelques pistes au hasard :

    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    ça serait peut-être pas mal aussi de tester le caractère qui est vraiment dans ta table... normalement, un ORD doit te donner 50069 pour Ï en utf8 (et 207 pour du latin1).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    ALut,

    1/ merci encore de ton aide

    2/ tests
    # avec un introducteur : not ok
    # avec utf8_unicode_ci : not ok

    4/ LOOÏ dans la BD j'ai NOOÃ

    4/ Plutot que de te faire prendre du tps et avoir une bidouille
    dans le code qui tôt ou tard posera pb, je reteste tous les param
    (insertion, update, liste, recherche) sur une table et un fichier test.

    SI l'app est bien faite, ce pb ne doit pas se poser.
    Les données on été importées, modifiées etc.
    Si il y a un mic mac, c'est dans le code ou des variables de l'app.

    Je te tiens au courant de mes tests si cela t'interesse

    Merci encore
    Samish
    Samish, rentier et futur retraité
    Padawan #7896358

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    1/ Résultats de mes tests :

    J'ai juste laisser :

    -ASP
    Response.Charset="utf-8"

    -HTML
    <!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="FR" lang="FR">
    <head>
    <title>TITRE</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8 " />

    Dans ma table de test :
    LOOÏ est écris sans char spéciaux (est ce normal ?)
    Sinon la recherche, l'insert fonctionne correctement.

    2/ Dans ma nvelle table ORD(INTIT) me retourne 50063 pour Ï ?

    3/ AUtres langues :
    - Le chinois passe en client side, mais dans la DB j'ai des "carrés" si je regarde via HeidiSQL les données de la table ?

    - thailandais : 95% des char sont ok, parfois des carrés (client side)

    - turc, russe, espagnol, grec, de, it, arabe, hebreu ok
    Samish, rentier et futur retraité
    Padawan #7896358

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

Discussions similaires

  1. Recherche insensible aux accents avec REGEXP
    Par khasyt dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/08/2009, 03h17
  2. [script.aculo.us] Autocompleter insensible aux accents
    Par oceanbigone dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 09/12/2008, 01h35
  3. Réponses: 7
    Dernier message: 26/07/2007, 11h33
  4. Comment effectuer une comparaison LIKE insensible à la casse ?
    Par Hervé Saladin dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 20/10/2006, 12h36
  5. Recherche insensible à la casse ET insensible aux accents.
    Par Bernard Grosdoy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 10/07/2005, 03h32

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