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 :
-
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.
-
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');
-
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.