2 votes

Problème de caractères turcs dans le serveur lié SQL Server vers PostgreSQL

J'ai ajouté un serveur lié PostgreSQL à mon serveur SQL avec l'aide de ce billet de blog. Mon problème est que lorsque j'utilise la requête ci-dessous, j'ai des problèmes avec les caractères turcs.

Requête sur Microsoft SQL Server 2012 :

SELECT * 
FROM OpenQuery(CARGO, 'SELECT taxno  ASACCOUNTNUM, title AS NAME FROM view_company');

Résultats réels :

MUSTAFA ÞAHÝNALP

Résultats attendus :

MUSTAFA ŞAHİNALP

1voto

srutzky Points 3766

Le problème est que l'encodage source est en ASCII étendu sur 8 bits en utilisant la Page de Code 1254 -- Windows Latin 5 (Turkish). Si vous suivez ce lien, vous verrez le tableau des caractères Latin5 avec leurs valeurs. La valeur du caractère Ş -- "Capitale latine lettre S avec cédille" -- est 222 (Décimal) / DE (Hexadécimal). Votre serveur local (c'est-à-dire SQL Server) a une Collation par défaut de SQL_Latin1_General_CP1_CI_AS qui est également de l'ASCII étendu sur 8 bits, mais en utilisant la Page de Code 1252 -- Windows Latin 1 (ANSI). Si vous suivez ce lien, vous verrez le tableau Latin1 qui montre le caractère Þ -- "Capitale latine lettre Thorn" -- ayant également une valeur de 222 (Décimal) / DE (Hexadécimal). C'est pourquoi vos caractères sont traduits de cette manière.

Il y a quelques choses que vous pouvez essayer :

  1. Utilisez sp_serveroption pour définir les deux options suivantes :

    EXEC sp_serveroption @server=N'linked_server_name',
                         @optname='use remote collation',
                         @optvalue=N'true';
    
    EXEC sp_serveroption @server=N'linked_server_name',
                         @optname='collation name',
                         @optvalue=N'Turkish_100_CI_AS';

    Je ne suis pas sûr que cela fonctionnera avec PostgreSQL comme système distant, mais cela vaut la peine d'essayer au moins. Veuillez noter que cela nécessite que toutes les collations de colonnes distantes soient définies sur cette valeur spécifique : Turque / Page de Code 1254.

  2. Forcer la collation pour chaque colonne :

    SELECT [ACCOUNTNUM], [NAME] COLLATE Turkish_100_CI_AS
    FROM   OPENQUERY(CARGO, 'SELECT taxno AS ACCOUNTNUM, title AS NAME FROM view_company');
  3. Convertir les valeurs de chaîne (uniquement celles avec des problèmes de correspondance de caractères) en VARBINARY et les insérer dans une table temporaire où la colonne est définie sur la bonne collation :

    CREATE TABLE #Temp ([AccountNum] INT, [Name] VARCHAR(100) COLLATE Turkish_100_CI_AS);
    
    INSERT INTO #Temp ([AccountNum], [Name])
      SELECT [ACCOUNTNUM], CONVERT(VARBINARY(100), [NAME])
      FROM  OPENQUERY(CARGO, 'SELECT taxno AS ACCOUNTNUM, title AS NAME FROM view_company');
    
    SELECT * FROM #Temp;

    Cette approche convertira d'abord les caractères entrants en leur représentation binaire / hexadécimale (par exemple, Ş --> 0xDE), puis, lors de l'insertion de 0xDE dans la colonne VARCHAR de la table temporaire, cela traduira 0xDE en le caractère attendu de cette valeur pour la Page de Code 1254 (puisque c'est la Collation de cette colonne). Le résultat sera Ş au lieu de Þ.

MISE À JOUR

L'option n° 1 a fonctionné pour l'OP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X