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 :

Problème de requète sur un champ de type string


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 78
    Par défaut Problème de requète sur un champ de type string
    Bonjour à la communauté de developpez.com

    Je suis actuellement confronté à un problème très bizarre sur SQL SERVER (version 2008 R2, 10.50.2500.0).
    Je m'explique. Dans une des tables SQL SERVER, j' ai un champ de type string qui renseigne un nom : "S. BICKLEY".

    Alors, si Je fais une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom_champ FROM Nom_table WHERE nom_champ='S. BICKLEY' --> rien
    SELECT nom_champ FROM Nom_table WHERE nom_champ like '%S. BICKLEY%' --> ok ca s'affiche
    SELECT nom_champ FROM Nom_table WHERE nom_champ like '%S. BICKLEY'--> rien
    SELECT nom_champ FROM Nom_table WHERE nom_champ like 'S. BICKLEY%' --> ok ca s'affiche
    Si je fais un update avec une requete du type :
    UPDATE nom_table SET nom_champ='S. BICKLEY' WHERE nom_champ like '%S. BICKLEY%'
    tout refonctionne normalement... ouf ! mais bof quand même ;-)

    Bref, vous l'aurez compris, c'est comme si ce qui est écrit dans ma table n' est pas vraiment ce qui est écrit ...
    Et ce problème n' apparait qu'avec ce nom. J' ai vérifié 50 fois : il n' y a pas d'espace après 'BICKLEY' ni avant 'S.' ...
    Je précise que je vois bien l'information écrite dans ma table avec Microsoft SQL Server Management.

    Est ce que ce ne pourrait pas venir d'une différence de culture entre mon langage de programmation de l'application qui écrit dans la base
    et le moteur SQLSERVER dans sa configuration ?

    Ou peut être un problème dans la conversion de caractères ASCII ?
    Peut il y avoir une différence entre l'information qui est écrit dans le fichier binaire de donnée SQL ? apparemment oui

    J' avoue que je sèche un peu la...

    Hervé

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Il aurai été intéressant d'afficher la longueur de la chaîne. A priori, vu les tests effectués, il s'agit d'un ou plusieurs caractères qui se situent après la chaîne. Sachant que tous les caractères ne sont pas imprimables et donc visibles !!
    Tu aurais aussi pu convertir la chaine en hexa pour voir le contenu exact.

    Je ne pense pas que ce soit un problème lié à la culture, sinon tes différents tests auraient tous été négatifs.

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Je suppose que votre colonne est de type varchar (donc elle utilise l'ASCII), et que la taille maximale qu'autorise ce type pour cette colonne est d'au plus 8000 caractères.
    Pour vous assurer que la chaîne ne contient pas de caractères non imprimables, il faut vérifier que leur code ASCII n'est pas compris entre 0 et 31.
    Pour ce faire, on peut créer une petite fonction de table en ligne :

    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
    18
    19
    20
    21
    22
    23
    CREATE FUNCTION f_string_characters_exploder
    	(@_string varchar(max))
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
    RETURN
    (
    	WITH
    		N AS(SELECT NULL AS v UNION ALL SELECT NULL)
    		, N1 AS (SELECT A.v FROM N AS A CROSS JOIN N AS B)
    		, N2 AS (SELECT A.v FROM N1 AS A CROSS JOIN N1 AS B)
    		, N3 AS (SELECT A.v FROM N2 AS A CROSS JOIN N2 AS B)
    		, N4 AS (SELECT A.v FROM N3 AS A CROSS JOIN N3 AS B)
    		, RN AS
    		(
    			SELECT	ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rn
    			FROM	N4
    		)
    	SELECT	SUBSTRING(@_string, RN.rn, 1) AS character
    		, ASCII(SUBSTRING(@_string, RN.rn, 1)) AS character_ASCII_code
    	FROM	RN
    	WHERE	rn BETWEEN 1 AND LEN(@_string)
    )
    Je disais 8000 caractères parce que si vous êtes en varchar(max), il vaut mieux créer une table utilitaire de nombres : la requête, une fois la fonction qui précède adaptée, en sera beaucoup plus performante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT		TEC.une_chaine
    		, SCE.character
    		, SCE.character_ASCII_code
    		, CASE WHEN SCE.character_ASCII_code BETWEEN 0 AND 31 THEN CAST(0 AS bit) ELSE CAST(1 AS bit) END AS is_printable_character
    FROM		dbo.test_explosion_chaine AS TEC
    CROSS APPLY	dbo.f_string_characters_exploder(TEC.une_chaine) AS SCE
    La colonne is_printable_character vous indique ce que vous cherchez. N'hésitez pas à rajouter une clause WHERE à la requête pour filtrer les lignes d'intérêt.

    @++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par herve4 Voir le message
    Bonjour à la communauté de developpez.com

    Je suis actuellement confronté à un problème très bizarre sur SQL SERVER (version 2008 R2, 10.50.2500.0).
    Je m'explique. Dans une des tables SQL SERVER, j' ai un champ de type string qui renseigne un nom : "S. BICKLEY".
    Le type "string" n'existe pas en SQL. Les chaines de caractères sont représentées par 6 types SQL différents :
    • CHAR(n)
    • VARCHAR(n)
    • VARCHAR(max)
    • NCHAR(n)
    • NVARCHAR(n)
    • NVARCHAR(max)

    n étant la longueur maximale.
    Sans cette information impossible de vous aider.
    En effet le comportement des requêtes SQL et notamment des fonctions de traitement de chaines comme LIKE diffère en fonction de ces types...

    Alors, si Je fais une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom_champ FROM Nom_table WHERE nom_champ='S. BICKLEY' --> rien
    SELECT nom_champ FROM Nom_table WHERE nom_champ like '%S. BICKLEY%' --> ok ca s'affiche
    SELECT nom_champ FROM Nom_table WHERE nom_champ like '%S. BICKLEY'--> rien
    SELECT nom_champ FROM Nom_table WHERE nom_champ like 'S. BICKLEY%' --> ok ca s'affiche
    Si je fais un update avec une requete du type :
    UPDATE nom_table SET nom_champ='S. BICKLEY' WHERE nom_champ like '%S. BICKLEY%'
    tout refonctionne normalement... ouf ! mais bof quand même ;-)
    Compte tenu de ce que vous constatez je parierais sur un VARCHAR avec des blancs en queue de chaine.

    Bref, vous l'aurez compris, c'est comme si ce qui est écrit dans ma table n' est pas vraiment ce qui est écrit ...
    Et ce problème n' apparait qu'avec ce nom. J' ai vérifié 50 fois : il n' y a pas d'espace après 'BICKLEY' ni avant 'S.' ...
    Je précise que je vois bien l'information écrite dans ma table avec Microsoft SQL Server Management.

    Est ce que ce ne pourrait pas venir d'une différence de culture entre mon langage de programmation de l'application qui écrit dans la base
    et le moteur SQLSERVER dans sa configuration ?

    Ou peut être un problème dans la conversion de caractères ASCII ?
    Peut il y avoir une différence entre l'information qui est écrit dans le fichier binaire de donnée SQL ? apparemment oui

    J' avoue que je sèche un peu la...

    Hervé
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [SQL Serveur 2005] Requête sur un champ de type XML
    Par Cyrilange dans le forum Développement
    Réponses: 3
    Dernier message: 23/06/2008, 07h15
  2. Problème sur un champ de type numéro-incrémenté
    Par loic20h28 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2008, 09h19
  3. [Conception] problème avec firefox sur les champs input type="file"
    Par maverick56 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 11/05/2007, 10h57
  4. [Doublons] Unicité sur un champ de type TEXT
    Par PyRoFlo dans le forum Requêtes
    Réponses: 11
    Dernier message: 01/09/2004, 09h56
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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