Zeichendaten falsch dargestellt, wenn die Codepage der Datenbank in SQL Server 2005 die Codepage des Clientcomputers unterscheidet


Problembeschreibung


Betrachten Sie das folgende Szenario:
  • In Microsoft SQL Server 2005 verwenden Sie SQL Server Management Studio auf Abfragedaten aus einer SQL Server-Datenbank, die eine nicht-Unicode-Daten verwendet. Beispielsweise verwendet die SQL Server-Datenbank den Datentyp Char , Varchar -Datentyp oder eingeben .
  • Die Codepage des Clientcomputers unterscheidet sich von der Codepage der Datenbank. Die Codepage ist der Sortierung der Datenbank zugeordnet.
In diesem Szenario werden fälschlicherweise Zeichendaten dargestellt.


Beispielsweise können Sie eines der folgenden Probleme auftreten:
  • Die Daten werden als Fragezeichen (?) dargestellt. Dieses Problem kann auftreten, wenn Sie oder die Daten als nicht-Unicode-Datentyp aktualisiert, bevor die Daten abgefragt. Dieses Problem tritt auf, wenn diese Änderung mithilfe von SQL Server Management Studio auf einem Clientcomputer, die eine andere Codepage.
  • Zeichendaten werden als beschädigte Daten dargestellt. Die Daten der Codepage X werden in einer Spalte nicht-Unicode-Codepage Ygespeichert. Darüber hinaus werden die Zeichendaten nicht übersetzt. Dieses Problem tritt auf, wenn Sie die Daten mithilfe von SQL Server Management Studio Abfragen.

    Hinweis Beim Abfragen der Daten mithilfe von SQL Query Analyzer in Microsoft SQL Server 2000 die Daten werden korrekt dargestellt Wenn die
    Zeichendaten übersetzen ist (Parameter Auto Translate ) deaktiviert. Auto Translate -Parameter ist ein Parameter der ConnectionString -Eigenschaft für Microsoft OLE DB Provider für SQL Server und Microsoft.NET Framework-Datenanbieter für OLE DB.

Ursache


Dieses Problem tritt auf, weil die Daten der Codepage
X ist in einer Spalte nicht-Unicode-Codepage gespeichert.
Y. darüber hinaus die Daten nicht korrekt übersetzt werden. Microsoft unterstützt nicht die Daten der Codepage speichern
X in einer Spalte der Codepage
Y.

In SQL Server 2005 Wenn Sie ein Zeichenfolgenliteral einen Unicode-Datentyp ist das Zeichenfolgenliteral konvertiert mithilfe der Datenbank-Standardcodepage, die Sortierung der Datenbank abgeleitet ist. Speichern von Zeichendaten Codepage X in einer Spalte der Codepage Y verursachen Datenverlust oder Beschädigung von Daten.

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

Hinweis SQL Server Management Studio verwendet Microsoft.NET Framework-Datenanbieter für SQL Server-Verbindung mit der SQL Server-Datenbank. Dieser Datenanbieter unterstützt Parameter Automatisch übersetzt .

PROBLEMUMGEHUNG


Um dieses Problem zu umgehen, verwenden Sie eine der folgenden Methoden.

Methode 1: Verwenden eines Unicode-Datentyps nicht-Unicode-Daten

Ändern der Spalten in einen Unicode-Datentyp die Probleme vermeiden, die Übersetzung der Codeseite verursacht werden. Verwenden Sie beispielsweise den Datentyp Nchar oder Nvarchar -Datentyp Ntext -Datentyp.

Weitere Informationen zum Speichern von Unicode-Daten klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:
239530 müssen Sie alle Unicode-Zeichenfolgen mit dem Präfix N voranstellen, Umgang mit Unicode-Zeichenfolge in SQL Server

Methode 2: Verwenden Sie eine geeignete Kollatierung für die Datenbank

Wenn Sie einen nicht-Unicode-Datentyp verwenden müssen, achten Sie die Codepage der Datenbank und die Codepage der nicht-Unicode-Spalten nicht-Unicode-Daten nicht korrekt speichern können. Wenn Sie Code Page 949 (Koreanisch) Daten speichern möchten, z. B. eine koreanische Sortierung für die Datenbank. Z. B. Korean_Wansung_CI_AS-Kollatierung für die Datenbank.

Methode 3: Verwenden Sie den Datentyp binary oder Varbinary-Datentyp

Verwenden Sie die Datenbank direkt speichern und Abrufen der genauen Bytewerte Zeichen erfolgt ohne Übersetzung der entsprechenden Code ausführen, den Datentyp binary oder Varbinary -Datentyp.

Methode 4: Verwenden Sie ein anderes Tool zum Speichern und Abrufen von Daten und deaktivieren Parameter Auto Translate

Warnung Wir testen oder Speichern von Zeichendaten Codepage unterstützt
X in einer Spalte der Codepage
Y. dieser Vorgang möglicherweise sprachlich falsche Ergebnisse falsch Zeichenfolgenvergleichs oder Bestellung und unerwarteten Code Übersetzung (beschädigte Daten). Wir empfehlen Ihnen, eine der anderen Methoden verwenden, um dieses Problem umgehen.

Microsoft OLE DB Provider für SQL Server-Verbindung zu einer Datenbank, die eine andere Codepage verwenden Abfragedaten aus einer nicht-Unicode-Spalte versuchen, müssen Sie sicherstellen, dass nicht übersetzten Zeichen in der Datenbank gespeichert.

Hinweis Angenommen, dass die Codepage des Clientcomputers Koreanisch (CP949) und die Codepage des SQL Server-Datenbank Englisch (CP1252 ist). Sie müssen die Platzhalter in den Codebeispielen durch Werte ersetzen, die für Ihre Situation geeignet sind.

Führen Sie dazu folgende Schritte gegebenenfalls anlog aus.
  1. Legen Sie die Daten in der Datenbank mit der Codepage der Datenbank manuell konvertieren Sie Zeichen in Rohdaten Zu diesem Zweck verwenden Sie Code ähnlich dem folgenden Codebeispiel.
    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;
    Hinweis Dieses Codebeispiel ist in C# geschrieben.
  2. Wenn Sie die Daten abfragen möchten, mit der Microsoft OLE DB Provider für SQL Server oder Microsoft.NET Framework-Datenanbieter für SQL Server mit der Datenbank verbinden und Auto Translate Parameter auf Falsefestgelegt. Zu diesem Zweck verwenden Sie Code ähnlich dem folgenden Codebeispiel.
    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False"
    );
    // code for representing the character data;

Status


Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.

Weitere Informationen


Schritte zum Reproduzieren des Problems

  1. Starten Sie auf dem Clientcomputer, Koreanisch (CP949) als Standard-Codepage ist SQL Server Management Studio.
  2. Verbinden Sie mit einer Datenbank mit Englisch (CP1252) als Standard-Codepage.
  3. Erstellen Sie eine Tabelle in der Datenbank mithilfe der folgenden Codezeile.
    Create table tbTest (A char(20), NA nchar(10), Comment char(20))
  4. Fügen Sie koreanische Zeichen in die Datenbank mithilfe der folgenden Abfrage ein.
    Insert into tbTest (A,NA,Comment) values('가',N'가','SQL2005/INSERT')
  5. Erstellen Sie eine select-Abfrage zum Abrufen der Daten mithilfe der folgenden Codezeile.
    select * from tbTest
Folgende Ergebnisse angezeigt. Der Wert in Spalte A ist ein Fragezeichen.
A                    NA         Comment
-------------------- ---------- --------------------
? 가 SQL2005/INSERT

Referenzen


Weitere Informationen über die SQL Server-Sortierung und Parameter Auto Translate klicken Sie auf die folgenden Artikelnummern klicken, um die Artikel der Microsoft Knowledge Base:
162367 koreanischen Double Byte Character Set übertragen von Zeichen

234748 Sie können nicht richtig übersetzt Zeichendaten von einem Client an einen Server mit SQL Server ODBC-Treiber die Servercodepage Clientcodepage unterscheidet

Weitere Informationen zu SQL Server Unicode-Datentypen finden Sie auf der folgenden Website von Microsoft Developer Network (MSDN):