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

MS SQL Server Discussion :

Collation et comparaison de chaine


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut Collation et comparaison de chaine
    Bonjour

    sur un serveur SQL 2005, j'ai
    - une base1 en FRENCH_CI_AS (avec les champs dans la meme collation)
    - une base2 en SQL_Latin1_General_CP1_CI_AS mais qui a certains champs en FRENCH_CI_AS

    je dois comparer un champs nvarchar en collation FRENCH_CI_AS venant de chaque base.

    l'affichage des champs est identique mais la comparaison échoue.

    en TSQL :
    comparaison avec =
    JOHN ET ELODIE
    JOHN*ET*ELODIE
    pas ok
    -------------------------------------------------------------
    comparaison avec binary_checksum
    1626569877
    536050533
    pas ok
    -------------------------------------------------------------
    comparaison avec varbinary
    0x4A4F484E20455420454C4F444945
    0x4A4F484EA04554A0454C4F444945
    pas ok
    Comment faire correctement cette comparaison ?


    la base1 est mise à jour depuis une autre application+DB dont je ne connais rien

    la base2 est mise à jour depuis un formulaire web (codage UTF8)


    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Vous devez utiliser une clause COLLATE dans la spécification des littéraux. Comme vous n'avez pas respceté la charte de postage en omettant votre requête difficile de vous aider plus.

    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/ * * * * *

  3. #3
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut
    Bonjour

    voila j'ai synthétisé un exemple de ce qui pose problème.
    ca donne quelque chose comme ca :

    table1 est en FRENCH_CI_AS
    table2 est en SQL_Latin1_General_CP1_CI_AS


    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
     
     
    declare
    @v1 as varchar(50) ,@v2 as varchar(50)
     
    select @v1 = ch1
    from table2
    where [CodeA] = 500 and [NI] = 19597
     
    ...plein de code/traitement intermédiaire sans modification de @v1....
     
    select @v2 = ch1 
    from table1
    where [CodeB] = 500 and [NI] = 19597
     
    ...plein de code/traitement intermédiaire sans modification de @v1/@v2....
     
     
    puis on test si @v1 = @v2 => echec
     
    sur l'exemple l'echec provient de l'espace qui est codé en 20 et en A0
    Merci

  4. #4
    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,

    - Quel est le type et la collation de la colonne ch1 dans table 1 ?
    - Quel est le type et la collation de la colonne ch1 dans table 2 ?

    @++

  5. #5
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut
    Bonjour

    ces champs sont
    varchar 32
    iso_1
    French_CI_AS
    (via SELECT * FROM INFORMATION_SCHEMA.COLUMNS)

    mais la base qui contient ces tables est en SQL_Latin1_General_CP1_CI_AS

    Merci

  6. #6
    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
    Si les colonnes sont dans la même collation, cela devrait fonctionner même si les bases de données n'ont pas la même collation par défaut.
    Je vais faire un test.

    Pouvez-vous donner le résultat de la requête suivante pour chacune des deux colonnes ?

    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
    SELECT		S.name AS schema_name
    		, T.name AS table_name
    		, C.name AS column_name
    		, TY.name AS data_type_name
    		, CASE WHEN TY.name IN ('nchar', 'nvarchar') THEN C.max_length / 2 ELSE C.max_length END AS max_length
    		, C.collation_name
    FROM		sys.schemas AS S
    INNER JOIN	sys.tables AS T
    			ON S.schema_id = T.schema_id
    INNER JOIN	sys.columns AS C 
    			ON C.object_id = T.object_id
    INNER JOIN	sys.types AS TY
    			ON TY.system_type_id = C.system_type_id
    			AND TY.system_type_id = TY.user_type_id
    WHERE		1 = 1
    AND		S.name = 'dbo'
    AND		T.name = 'maTable'
    AND		C.name = 'maColonne'
    @++

  7. #7
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    dbo	extranet_majclients	maj_Prénom	varchar	32	French_CI_AS
     
     
    dbo	extranet_clients	Prénom	varchar	32	French_CI_AS

  8. #8
    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
    l'affichage des champs est identique mais la comparaison échoue.
    Est-ce que vous obtenez une erreur (1) ou bien est-ce que c'est la comparaison qui ne vous retourne pas ce dont vous avez besoin (2) ?

    Si c'est (1), donnez-nous le libellé exact et complet de l'erreur.
    Si c'est (2), donnez le texte réel et complet de la requête.

    @++

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    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
    declare
    @v1 AS varchar(50) ,@v2 AS varchar(50)
     
    SELECT @v1 = ch1
    FROM table2
    WHERE [CodeA] = 500 AND [NI] = 19597 COLLATE French_CI_AI
     
    ...plein de code/traitement intermédiaire sans modification de @v1....
     
    SELECT @v2 = ch1 
    FROM table1
    WHERE [CodeB] = 500 AND [NI] = 19597 COLLATE French_CI_AI
    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. [VBA]excel comparaison de chaine de caractere
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2006, 15h32
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 18h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 09h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 17h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41

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