it-swarm.com.de

Codierungsproblem mit der SQL Server VARCHAR-Spalte, die in Python

Wir hatten kürzlich ein Problem mit der Codierung in Bezug auf ein Feld, das als varchar (120) in SQL Server gespeichert wird. In SSMS wird der Varchar wie folgt angezeigt:

"Wer hat JonBen getötet?"

Wenn es jedoch in Python gebracht wird, sieht es so aus:

(enter image description here

Ich habe dies von der Python Seite aus untersucht, und nichts Seltsames ist los. Meine Theorie ist, dass der Varchar in SQL Server UTF-8-Zeichen akzeptiert, die in python anders angezeigt werden als in SSMS. Ich bin mit der Codierung in SQL Server nicht sehr vertraut. Kann mir bitte jemand folgendes mitteilen:

  • Gibt es in SSMS eine Möglichkeit, die Codierung des Varchars anzuzeigen? Siehe zum Beispiel\x82, anstatt das Komma anzuzeigen, wie es derzeit von SSMS stammt.
  • Wir verwenden SQL Server 2008. Gibt es eine Möglichkeit, die Codierung für UTF-8-Zeichen in ASCII - Zeichen zu ändern, ohne Import-/Export-Tools zu verwenden oder in eine flache Datei zu kopieren? Das heißt, Kann ich diese Konvertierung über eine Abfrage vornehmen?
  • Gibt es eine Möglichkeit, problematische Datensätze programmgesteuert über eine Abfrage zu identifizieren (problematisch als UTF-8-Zeichen definiert, die nicht über ASCII unterstützt werden)?

Vielen Dank im Voraus!

Mit sp_help N'table_name'; Habe ich festgestellt, dass die Sortierung dieser VARCHAR Spalte lautet: SQL_Latin1_General_CP1_CI_AS.

10
Eric

SQL Server speichert UTF-8 unter keinen Umständen. Sie erhalten entweder UTF-16 Little Endian (LE) über NVARCHAR (einschließlich NCHAR und NTEXT, verwenden jedoch niemals NTEXT) und XML oder eine 8-Bit-Codierung basierend auf einer Codepage über VARCHAR (einschließlich CHAR und TEXT, verwenden Sie jedoch niemals TEXT).

Das Problem hierbei ist, dass Ihr Code dieses 0x82-Zeichen falsch übersetzt und denkt, dass es UTF-8 ist, aber nicht. Es gibt kein UTF-8 "Zeichen" mit dem Wert 0x82, weshalb Sie das "Unbekannte"/Ersatzsymbol "�" erhalten. In der folgenden UTF-8-Tabelle wird angezeigt, dass für ein Einzelbyte von 0x82 kein Zeichen vorhanden ist:

TF-8-Codierungstabelle

Wie vom OP angegeben, lautet die Sortierung der betreffenden Spalte SQL_Latin1_General_CP1_CI_AS, Was bedeutet, dass für die 8-Bit-Codierung Code Page 1252 verwendet wird, dh Windows Latin 1 (ANSI) . Wenn Sie das Diagramm 0 (scrollen Sie nach unten zum unteren Diagramm, da es die Zeichennamen enthält) überprüfen, ist der Wert 0x82 (suchen Sie in der Spalte "Code Point" nach "82") tatsächlich Single Low-9 Quotation Mark = das sehen Sie in SSMS. Dieses Zeichen in UTF-8 ist eine 3-Byte-Sequenz: E2 80 9A.

Dies alles bedeutet: Ihr Python Code muss entweder die Client-Codierung für die SQL Server-Verbindung auf Code Page 1252 festlegen oder Sie müssen die Codierung der zurückgegebenen Zeichenfolge ändern/konvertieren von Code Page 1252 bis UTF-8.

Wenn dies auf einer Webseite angezeigt wird, können Sie natürlich den deklarierten Zeichensatz der Seite in Windows-1252 Ändern. Dies kann jedoch andere Zeichen auf der Seite beeinträchtigen, wenn bereits UTF-8-Zeichen vorhanden sind.

17
Solomon Rutzky