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

Développement SQL Server Discussion :

LIKE sur NCHAR : comment prendre en compte les espaces signifiants ? [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut LIKE sur NCHAR : comment prendre en compte les espaces signifiants ?
    Bonjour,

    Dans le cas où une colonne est de type NCHAR l'utilisation de l'argument LIKE se comporte du façon différente qu'avec un CHAR. En effet les espaces de droite deviennent signifiants.

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table matable (nom nchar(50))
     
    insert into matable values ('Florian')
     
    SELECT * FROM matable WHERE nom LIKE N'%Florian' OR nom LIKE '%Florian'
    Le SELECT le retourna aucune ligne à cause des espaces signifiants.

    Mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE nom LIKE N'%Florian[ ]%'
    J'obtiens bien une ligne.

    Ma question est simple : dans le cadre d'un NCHAR sommes nous obligés d'utiliser le pattern '%xxx[ ]%' pour régler se problème d'espace significatif, ou existe t-il une solution permettant d'utiliser LIKE '%xxx' ?

    Merci !

    EDIT : merci aieeeuuuuu pour la remarque => mauvais explication du problème
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,


    Si vous n'utilisez pas de caractère joker, faites un égal et le problème sera réglé !

    sinon vous pouvez transtyper votre littéral en NCHAR(50) pour faire votre LIKE, et le problème sera réglé également.

  3. #3
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Effectivement le égal et la solution. Mais ma question se portait sur l'utilisation du LIKE qui pouvait être comme cela aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE nom LIKE '%orian'
    Où dans ce cas j'aurais la même problématique (pas de lignes retournées).

    Et dans ce cas même CAST ne fonctionnera pas (sauf si je met à NCHAR(48)) (et la requête est vraiment casse gueule) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE nom LIKE '%' + CAST('orian' AS NCHAR(50))
    Si je comprend bien, il me reste pas trop le choix du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE nom LIKE '%orian[ ]%'
    Merci
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Pourquoi votre colonne est-elle en NCHAR(50) et non en CHAR(50) voire en VARCHAR(50) ?
    êtes dans un environnement international ?

  5. #5
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Exactement nous sommes passés sur l’Unicode pour supporter l'international.

    Etanne
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je ne suis pas sûr d'avoir bien compris la demande mais si tu as un problème avec les espaces à droites pourquoi ne pas appliquer un RTRIM au nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update matable set nom = rtrim(nom)
    Comme ça le problème est réglé. Éventuellement un trigger pour appliquer l'update sur les entrées nouvelles ou modifiées.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Etanne Voir le message
    Exactement nous sommes passés sur l’Unicode pour supporter l'international.
    Pas de CHAR(50) donc...

    Mais il vous reste le NVARCHAR(50). Pourquoi votre colonne est-elle de taille fixe ? Que contient-elle ?

  8. #8
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Je suis dans le cas d'une clause WHERE avec un LIKE où il n'y a pas de joker à la fin de mon pattern.

    Dans le cas de l'Unicode le fonctionnement est différent, mais si cela est documenté dans la MSDN ce changement de comportement reste intrigant pour moi et j'espérai qu'il existe un astuce pour passer cette problématique.

    Etanne
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  9. #9
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Pas de CHAR(50) donc...

    Mais il vous reste le NVARCHAR(50). Pourquoi votre colonne est-elle de taille fixe ? Que contient-elle ?
    Certaines colonnes (pas toutes) sont en NCHAR pour les raisons suivantes :
    • Soit l'ancienneté du schéma et les erreurs du début où le changement est prévu pour bientôt
    • Ou l'on souhaite un gain de performance (contre la fragmentation, calcul d'offset, etc.)


    Concernant le NVARCHAR la MSDN indique la problématique :
    When you use Unicode data (nchar or nvarchar data types) with LIKE, trailing blanks are significant; however, for non-Unicode data, trailing blanks are not significant.
    Etanne
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Etanne Voir le message
    Concernant le NVARCHAR la MSDN indique la problématique.
    Ok. Problème connu mais même pas de solution de contournement indiqué...
    Ce que j'ai dit avant est donc complètement crétin. Toutes mes plus plates excuses.

  11. #11
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Il faut dire que j'avais mal embrayé la discussion donc j'accepte les excuses

    Comme vous le dites (vous deux), pas d'autres solutions que le ... nom LIKE '%blabla[ ]%' ou (msdn) ... RTRIM(nom) LIKE '%blabla'

    Merci !
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Non, pas de meilleure solution à proposer.

    Mais j'ai quand même une préférence pour celle avec RTRIM : pour la maintenance, on en comprend mieux l’intérêt. Par ailleurs, nom LIKE '%blabla[ ]%' sera vrai pour 'blabla blibli', ce qui n'est pas forcément l'effet souhaité.

    Enfin, comme le pattern de la solution avec RTRIM est plus simple, la consommation CPU devrait être un peu moindre...

  13. #13
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Bien vu.. ..effectivement le '[]%' n'est pas bon.

    Merci pour l'aide !
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2012, 13h46
  2. Boucle for sur une variable sans prendre en compte les espaces
    Par laurentze dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/03/2012, 11h15
  3. [RegEx] Comment prendre en compte les caractères accentués ?
    Par jfrag dans le forum Langage
    Réponses: 8
    Dernier message: 12/02/2008, 17h34
  4. Prendre en compte les espaces dans les filtres
    Par Ekinoks dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 03/11/2006, 02h57
  5. [plugin][tomcat] Comment prendre en compte les jar ?
    Par djodjo dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 08/04/2004, 19h47

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