Freigeben über


Zeichendaten werden falsch dargestellt, wenn sich die Codepage des Clientcomputers von der Datenbank unterscheidet.

Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 904803

Problembeschreibung

Stellen Sie sich folgendes Szenario vor:

  • Sie verwenden SQL Server Management Studio, um Zeichendaten aus einer SQL Server-Datenbank abzufragen, die einen Nicht-Unicode-Datentyp verwendet. Die SQL Server-Datenbank verwendet z. B. den charDatentyp , varcharoder text den Datentyp.

  • Die Codepage des Clientcomputers unterscheidet sich von der Codepage der Datenbank. Die Codeseite ist der Sortierung der Datenbank zugeordnet.

In diesem Szenario werden Zeichendaten falsch dargestellt.

Sie können beispielsweise eines der folgenden Probleme haben:

  • Die Zeichendaten werden als Fragezeichen (?) dargestellt. Dieses Problem wird möglicherweise angezeigt, wenn Sie die Zeichendaten als Nicht-Unicode-Datentyp einfügen oder aktualisieren, bevor Sie die Zeichendaten abfragen. Dieses Problem tritt auf, wenn Sie diese Änderung mithilfe von SQL Server Management Studio auf einem Clientcomputer vornehmen, auf dem eine andere Codeseite vorhanden ist.

  • Die Zeichendaten werden als beschädigte Daten dargestellt. Die Zeichendaten von Codepage X werden in einer Nicht-Unicode-Spalte der Codepage Y gespeichert. Darüber hinaus werden die Zeichendaten nicht übersetzt. Dieses Problem tritt auf, wenn Sie die Zeichendaten mithilfe von SQL Server Management Studio abfragen.

    Notiz

    Wenn Sie die Zeichendaten mithilfe von SQL Server Management Studio abfragen, werden die Zeichendaten korrekt dargestellt, wenn die Einstellung "Übersetzung für Zeichendaten ausführen" (auch als Auto Translate Parameter bezeichnet) deaktiviert ist. Der Auto Translate Parameter ist ein Parameter der ConnectionString Eigenschaft für Microsoft OLE DB-Anbieter für SQL Server und für Microsoft .NET Framework Datenanbieter für OLE DB.

Ursache

Dieses Problem tritt auf, da die Zeichendaten der Codepage X in einer Nicht-Unicode-Spalte der Codepage Y gespeichert werden, die nicht unterstützt wird.

Wenn Sie in SQL Server ein Zeichenfolgenliteral eines Nicht-Unicode-Datentyps verwenden, wird das Zeichenfolgenliteral mithilfe der Standardcodeseite der Datenbank konvertiert, die von der Sortierung der Datenbank abgeleitet ist. Das Speichern der Zeichendaten von Codepage X in einer Spalte der Codeseite Y kann zu Datenverlust oder Datenbeschädigung führen.

Wenn die Zeichendaten als beschädigte Daten dargestellt werden, können die Daten nur korrekt dargestellt werden, wenn Sie den Auto Translate Parameter für microsoft OLE DB-Anbieter für SQL Server oder Microsoft .NET Framework Datenanbieter für OLE DB deaktivieren.

Notiz

SQL Server Management Studio verwendet Microsoft .NET Framework Datenanbieter für SQL Server, um eine Verbindung mit der SQL Server-Datenbank herzustellen. Dieser Datenanbieter unterstützt den Auto Translate Parameter nicht.

Problemumgehung

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen:

Methode 1: Verwenden eines Unicode-Datentyps anstelle eines Nicht-Unicode-Datentyps

Ändern Sie die Spalten in einen Unicode-Datentyp, um alle Probleme zu vermeiden, die durch die Codeseitenübersetzung verursacht werden. Verwenden Sie z. B. den Datentyp oder nvarcharntext den ncharDatentyp.

Methode 2: Verwenden einer geeigneten Sortierung für die Datenbank

Wenn Sie einen Nicht-Unicode-Datentyp verwenden müssen, stellen Sie immer sicher, dass die Codepage der Datenbank und die Codepage aller Nicht-Unicode-Spalten die Nicht-Unicode-Daten richtig speichern kann. Wenn Sie z. B. Codepage 949 (Koreanisch) Zeichendaten speichern möchten, verwenden Sie eine koreanische Sortierung für die Datenbank. Verwenden Sie z. B. die Korean_Wansung_CI_AS Sortierung für die Datenbank.

Methode 3: Verwenden des Datentyps "binary" oder "varbinary"

Wenn die Datenbank die genauen Bytewerte der behandelten Zeichen direkt speichern und abrufen soll, ohne eine entsprechende Codeseitenübersetzung durchzuführen, verwenden Sie den Datentyp oder varbinary den binary Datentyp.

Methode 4: Verwenden Eines anderen Tools zum Speichern und Abrufen von Daten und Deaktivieren des Parameters "Auto Translate"

Warnung

Wir testen oder unterstützen nicht das Speichern der Zeichendaten von Codepage X in einer Spalte mit Codepage Y. Dieser Vorgang kann linguistisch falsche Abfrageergebnisse, falsche Zeichenfolgenabgleich oder Sortierung und unerwartete Codeseitenübersetzung (Datenbeschädigung) verursachen. Wir empfehlen Ihnen, eine der anderen Methoden zu verwenden, um dieses Problem zu umgehen.

Wenn Sie microsoft OLE DB-Anbieter für SQL Server verwenden, um eine Verbindung mit einer Datenbank herzustellen, die über eine andere Codeseite verfügt und Sie versuchen, Zeichendaten aus einer Nicht-Unicode-Datentypspalte abzufragen, stellen Sie sicher, dass Sie die nicht übersetzten Zeichen in der Datenbank speichern.

Notiz

Im folgenden Beispiel wird davon ausgegangen, dass die Codeseite des Clientcomputers Koreanisch (CP949) ist und dass die Codepage der SQL Server-Datenbank Englisch (CP1252) ist. Sie müssen die Platzhalter in den Codebeispielen durch Werte ersetzen, die für Ihre Situation geeignet sind.

Gehen Sie folgendermaßen vor, um dieses Problem zu umgehen:

  1. Konvertieren Sie die Zeichen manuell in Rohdaten, und fügen Sie dann die Daten mithilfe der Codepage der Datenbank in die Datenbank ein. Verwenden Sie zum Ausführen dieses Vorgangs einen Codeausschnitt, der dem folgenden ähnelt:

    string strsrc="가";string strsrc="가";
    string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc));
    sql="insert into <tablename> (<column>,) values ('" + strtag + "')";
    // code for updating the database;
    
  2. Wenn Sie die Daten abfragen möchten, verwenden Sie den Microsoft OLE DB-Anbieter für SQL Server oder Microsoft .NET Framework Datenanbieter für SQL Server, um eine Verbindung mit der Datenbank herzustellen, und legen Sie dann den Auto Translate Parameter auf False. Verwenden Sie zum Ausführen dieses Vorgangs einen Codeausschnitt, der dem folgenden ähnelt:

    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False");
    // code for representing the character data;
    

Weitere Informationen

Führen Sie die folgenden Schritte aus, um das Problem zu reproduzieren:

  1. Starten Sie auf dem Clientcomputer mit Koreanisch (CP949) als Standardcodepage SQL Server Management Studio.

  2. Stellen Sie eine Verbindung mit einer Datenbank her, die Englisch (CP1252) als Standardcodepage aufweist.

  3. Erstellen Sie eine Tabelle in der Datenbank mithilfe der folgenden Abfrage:

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. Fügen Sie ein koreanisches Zeichen in die Datenbank ein, indem Sie die folgende Abfrage verwenden:

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. Erstellen Sie eine Auswahlabfrage zum Abrufen der Daten mithilfe der folgenden Abfrage:

    SELECT * FROM tbTest
    

Sie erhalten die folgenden Ergebnisse. Der Wert in Spalte A ist ein Fragezeichen.


A                    NA         Comment
-------------------- ---------- --------------------
?                    가          SQLServer/INSERT

References