Zeichendaten werden falsch dargestellt, wenn sich die Codepage des Clientcomputers von der 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 beispielsweise den charDatentyp , varcharoder text .

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

In diesem Szenario werden Zeichendaten falsch dargestellt.

Beispielsweise kann eines der folgenden Probleme auftreten:

  • Die Zeichendaten werden als Fragezeichen (?) dargestellt. Dieses Problem tritt möglicherweise auf, 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, der über eine andere Codepage verfügt.

  • Die Zeichendaten werden als beschädigte Daten dargestellt. Die Zeichendaten der 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.

    Hinweis

    Wenn Sie die Zeichendaten mithilfe von SQL Server Management Studio abfragen, werden die Zeichendaten ordnungsgemäß 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 den Microsoft OLE DB-Anbieter für SQL Server und für Microsoft .NET Framework-Datenanbieter für OLE DB.

Ursache

Dieses Problem tritt auf, weil 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 Standardcodepage der Datenbank konvertiert, die von der Sortierung der Datenbank abgeleitet ist. Das Speichern der Zeichendaten der Codepage X in einer Spalte der Codepage Y kann zu Datenverlusten oder Datenbeschädigungen führen.

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

Hinweis

SQL Server Management Studio verwendet den 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 Codepageübersetzung verursacht werden. Verwenden Sie beispielsweise den ncharDatentyp , nvarcharoder ntext .

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 Nicht-Unicode-Daten auf der Codepage der Datenbank und auf der Codepage aller Nicht-Unicode-Spalten ordnungsgemäß gespeichert werden können. Wenn Sie z. B. codepage 949 (koreanisch) Zeichendaten speichern möchten, verwenden Sie eine koreanische Sortierung für die Datenbank. Verwenden Sie beispielsweise 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 Zeichen, die behandelt werden, ohne eine entsprechende Codepageübersetzung durchzuführen, direkt speichern und abrufen soll, verwenden Sie den binary Datentyp oder varbinary .

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

Warnung

Wir testen oder unterstützen weder das Speichern der Zeichendaten von Codepage X in einer Spalte der Codepage Y. Dieser Vorgang kann zu linguistisch falschen Abfrageergebnissen, falschen Zeichenfolgenabgleich oder -sortierung und unerwarteter Codepageübersetzung (Datenbeschädigung) führen. Wir empfehlen Ihnen, eine der anderen Methoden zu verwenden, um dieses Problem zu umgehen.

Wenn Sie den Microsoft OLE DB-Anbieter für SQL Server verwenden, um eine Verbindung mit einer Datenbank herzustellen, die über eine andere Codepage 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.

Hinweis

Im folgenden Beispiel wird davon ausgegangen, dass die Codepage 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 die Daten dann mithilfe der Codepage der Datenbank in die Datenbank ein. Verwenden Sie für diesen Vorgang 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 festFalse. Verwenden Sie für diesen Vorgang 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 mithilfe der folgenden Abfrage eine Tabelle in der Datenbank:

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

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

    SELECT * FROM tbTest
    

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


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

References