2

Ich habe einen PostgreSQL-Verbindungsserver mit Hilfe von this blog post zu meinem SQL Server hinzugefügt. Mein Problem ist, wenn ich die Abfrage unten verwende, habe ich Probleme mit türkischen Zeichen.SQL Server verknüpfter Server zu PostgreSQL Türkisch Charakter Problem

Abfrage auf Microsoft SQL Server 2012:

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

Tatsächliche Ergebnisse:

MUSTAFA ÞAHÝNALP

Erwartete Ergebnisse:

MUSTAFA ŞAHİNALP

+0

Was ist Ihr Server-Sortierung? Wie lautet der Datentyp des Titels auf dem PostgreSQL-Server? Versuchen Sie ''SELECT taxno ASACCOUNTNUM, KONVERTIEREN (NVARCHAR (128), Titel) ALS NAME VON view_company'' – scsimon

+0

view_company in der PostgreSQL-Datenbank, so wenn die Abfrage * aus view_company in pgAdmin auswählen, die Ergebnisse korrekt zurückgegeben. Mein Problem ist, wenn ich obige Frage in MS Sql verwende, habe ich Probleme mit türkischen Zeichen havins. –

+0

Wie ist der Verbindungsserver konfiguriert? Ist 'Server-Kollation verwenden 'aktiviert? –

Antwort

0

Das Problem ist, dass die Quellcodierung 8-Bit Extended ASCII mit Code Seite 1254 - Windows Latin 5 (Turkish) ist. Wenn Sie diesem Link folgen, sehen Sie das Latin5-Diagramm der Zeichen als Werte. Der Wert des Ş Zeichens - "Lateinischer Großbuchstabe S mit Cedilla" - ist (Dezimal)/DE (Hex). Ihr lokaler Server (d. H. SQL Server) hat eine Standardsortierung von SQL_Latin1_General_CP1_CI_AS, die auch 8-Bit Extended ASCII ist, aber Code Seite 1252 - Windows Latin 1 (ANSI). Wenn Sie diesem Link folgen, sehen Sie das Latin1-Diagramm, das das Zeichen Þ - "Latin Capital Letter Thorn" - ebenfalls mit einem Wert von (Dezimal)/DE (Hex) zeigt. Aus diesem Grund werden deine Charaktere auf diese Weise übersetzt.

Es gibt ein paar Dinge, die Sie ausprobieren können:

  1. Verwenden sp_serveroption die beiden folgenden Optionen einzustellen:

    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'; 
    

    nicht sicher, ob das mit PostgreSQL als Remote-System einwandfrei funktioniert, aber es ist zumindest einen Versuch wert. Bitte beachten Sie, dass dies erfordert, dass alle Remote-Spalte Sortierungen auf diesen speziellen Wert eingestellt werden: Türkisch/Codepage 1254.

  2. die Sortierungs Kraft pro jeder Spalte:

    SELECT [ACCOUNTNUM], [NAME] COLLATE Turkish_100_CI_AS 
    FROM OPENQUERY(CARGO, 'SELECT taxno AS ACCOUNTNUM, title AS NAME FROM view_company'); 
    
  3. die String-Werte konvertieren (nur die diejenigen mit Zeichenzuordnung Fragen) zu VARBINARY und in eine temporäre Tabelle einfügen, wo die Spalte auf die richtigen Sortierungs gesetzt:

    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; 
    

    Dieser Ansatz wird die eingehenden Zeichen in thei zuerst konvertieren r binäre/hexadezimale Darstellung (z.B. Ş-> 0xDE) und dann auf 0xDE in die VARCHAR Spalte in der temporären Tabelle einfügen, wird es 0xDE in den erwarteten Charakter dieses Wertes für Codepage 1254 (übersetzen, da dies die Sortierungs dieser Spalte) ist. Das Ergebnis ist Ş anstelle von Þ.

UPDATE

Option # 1 arbeitete für die O. P.