Zeichendaten von einem Client an einen Server kann nicht richtig übersetzt werden, mithilfe des SQL Server-ODBC-Treibers weicht Clientcodepage von der Codepage des Servers

Problembeschreibung

Bei Verwendung von MDAC 2.1 oder höher der SQL Server-ODBC-Treiber (Version 3.70.0623 oder höher) oder OLE DB-Provider (Version 7.01.0623 oder höher), unter Umständen treten möglicherweise übersetzt Zeichendaten von der Codepage Client Server-Codepage auch wenn Autotranslation für die Verbindung deaktiviert ist.

Ursache

Autotranslation ist nicht der einzige Mechanismus, der die Konvertierung Seite Code führen kann. SQL Server 7.0 ODBC-Treiber und OLE DB-Provider stellen ein neues Verhalten MSDE 1.0, SQL Server 7.0 oder höher eine Verbindung. Alle SQL-Anweisungen als Sprachereignis werden in Unicode auf dem Client konvertiert an den Server gesendet. Im Endeffekt dieser ähnelt einer Autotranslation alle Daten vom Client an den Server mittels eines, unabhängig von der aktuellen Einstellung Autotranslation für die Verbindung. Dies führt nicht Probleme außer beim Versuch zum Speichern von Zeichendaten in einer Codepage als SQL Server-Codepage nicht übersetzt.

PROBLEMUMGEHUNG

Speichern Sie Seite X Daten nicht in einer Codepage Y SQL Server (z. B. Code 950 Seitendaten in einem Code Page 1252). In einigen Fällen mit früheren Versionen von SQL Server möglich war es immer nicht unterstützt wurde. Auf einem SQL Server 1252 ist alles andere als ein 1252 Zeichen keine Daten. Nicht-Unicode-Zeichendaten von einer anderen Codepage nicht richtig sortiert und zwei Byte (DBCS) Daten SQL Server erkennt keine Zeichen Grenzen korrekt. Dadurch können schwerwiegende Probleme, wie im folgenden Artikel der Microsoft Knowledge Base beschriebene Problem:
155723 -INF: SQL Server eine DBCS-Zeichenfolge abgeschnitten

Die beste Wahl für die SQL Server-Codepage ist die Codepage des Clients, die auf den Server zugreifen.

Server und Client haben unterschiedliche Codepages müssen, aber sicherstellen, dass Autotranslation auf dem Client aktiviert ist, so dass Sie richtige Übersetzung von Daten von der Server-Codepage in allen Fällen.

Wenn der Server mehrere Codepages Daten speichern muss, ist unterstützte Lösung zum Speichern der Daten in Unicode-Spalten (NCHAR/NVARCHAR/NTEXT).

Wenn Ihre Situation erfordert Code Seite X in einer Codepage Y SQL Server speichern, werden nur zwei Möglichkeiten zuverlässig:
  • Speichern Sie die Daten in den Spalten binary-Spalten (BINARY/VARBINARY/BILD).
  • Schreiben der Anwendung Remoteprozeduraufrufe (RPCs) für alle SQL-Anweisungen, die mit Zeichendaten. Daten über eine RPC-Ereignisses unterliegt diese Konvertierung. Beachten Sie, dass keine Treiber oder DSN-Ebene, die Sie zum Ändern der Ereignisse gesendet werden. Ob ein Befehl als Sprache oder RPC-Ereignis gesendet wird hängt APIs und Syntax vom Programmierer gewählt werden, wenn die Anwendung geschrieben ist.

Weitere Informationen

Autotranslation (d. h. "Übersetzung für Zeichendaten ausführen" Kontrollkästchen in neuere ODBC Applications) konvertiert Zeichendaten aus Clientcodepage Codepage Server vor dem Senden der Daten an den Server mit Unicode Translation Medium. 3.7 SQL Server ODBC-Treiber konvertiert jedoch auch alle SQL-Anweisungen vor dem Inverkehrbringen des Drahts, der Autotranslation ähnelt aber unterliegt nicht der Autotranslation Einstellung wirkt als Sprachereignis an Unicode gesendet. Im Gegensatz dazu entsprechen Zeichendaten vom Server an die Clients das Autotranslation-Flag. Bei Autotranslation kommt die Daten auf dem Client mit der gleichen Zeichencodes Daten mussten auf dem Server. Übersetzung von Daten für Client-zu-Server-RPC-Ereignisse kann auch Autotranslation deaktivieren deaktiviert werden. Ein einfaches Skript, das veranschaulicht, wie dieses Verhalten Sprachereignisse beeinflusst folgt. Dieses Beispiel wurde von Query Analyzer ein Code Seite 1252-Client eine Verbindung mit einem Code Seite 437 Server ausgeführt:
-- Turn Autotranslation off here.    USE tempdb
GO
CREATE TABLE t1 (c1 int, c2 char(1))
GO

-- Enter a yen character, using the keystroke ALT-0165.
INSERT INTO t1 VALUES (1, '¥')
SELECT c1, c2, ASCII (c2) FROM t1
c1          c2                       ----------- ---- ----------- 
1  157

(1 row(s) affected)
Beachten Sie Folgendes zum vorherigen Beispiel:
  • Obwohl dieser Stapel Autotranslation deaktiviert war, wurde der Zeichencode 165 (Yen in Codepage 1252) 157 (Yen in Codepage 437) konvertiert. Ist der ODBC-Treiber vor dem Senden die SQL-Zeichenfolge in Unicode konvertiert der Server der Server zu dem entsprechenden Zeichen für die Speicherung in Codepage 437 konvertiert wurde.
  • Hat der Client AUSWÄHLEN , die Daten abzurufen, der gerade gespeicherten Zeichen 157 angekommen nicht übersetzt Client (157 wird als ein "" auf einem Client Codepage 1252). Ist die Konvertierung in diesem Artikel beschriebenen gilt nur für Daten vom Client an den Server, nicht vom Server an den Client gesendet. Daten wurde nicht übersetzt werden, da die Autotranslation deaktiviert ist.

-- Turn Autotranslation back on before running the following batch.    INSERT INTO t1 VALUES (2, '¥')
SELECT c1, c2, ASCII (c2) FROM t1
c1          c2                       ----------- ---- ----------- 
1 ¥ 157
2 ¥ 157

(2 row(s) affected)
In diesem Fall Autotranslation wieder einschalten hatte keine Auswirkung auf die Übersetzung vom Client zum Server (d. h. die gleiche richtige Übersetzung Zeichencode 165 in Zeichencode 157 passiert,) aber auf die vom Server abgerufenen Daten. Beachten Sie, dass bei die SELECT -Anweisung (mit Autotranslation auf) auszuführen ist, Yen Symbole ordnungsgemäß in Code Page 1252 Anwendung, da sie von Zeichencode 157, Zeichencode 165 Autotranslation Mechanismus übersetzt.

Sie sehen dies (Konvertierung Sprachereignisse in Unicode auf dem Client) bei jeder SQL Server-ODBC-, Treiberversion 3.70 oder höher und Herstellen einer Verbindung mit SQL Server 7.0 oder höher verwenden. Es erfolgt keine älteren ODBC-Treiber oder der 3.7-Treiber die Verbindung zu SQL Server 6.5 oder früher verwenden. Darüber hinaus Speichern von Daten in Unicode-Spalten werden (NCHAR/NVARCHAR/NTEXT) die Konvertierung nicht problematisch.
Weitere Informationen zur Darstellung von Daten in SQL Server 2005 klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:

904803 Zeichen ist falsch dargestellt, wenn die Codepage der Datenbank in SQL Server 2005 die Codepage des Clientcomputers unterscheidet

Eigenschaften

Artikelnummer: 234748 – Letzte Überarbeitung: 10.01.2017 – Revision: 1

Feedback