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:
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? Dh 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)?
Danke im Voraus!
Mit sp_help N'table_name';
fand ich, dass die Sortierung dieser VARCHAR
Spalte ist : SQL_Latin1_General_CP1_CI_AS
.
VARCHAR
Spalte?sp_help N'table_name';
. Schauen Sie sich die Spalte basierend auf "Name" und dann die Spalte "Kollationsname" an.Antworten:
SQL Server speichert UTF-8 unter keinen Umständen. Sie erhalten entweder UTF-16 Little Endian (LE) über
NVARCHAR
(einschließlichNCHAR
undNTEXT
, aber nie verwendetNTEXT
) undXML
oder eine 8-Bit-Codierung basierend auf einer Codepage überVARCHAR
(einschließlichCHAR
undTEXT
, aber nie verwendenTEXT
). .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:
UTF-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, bei dem es sich um Windows Latin 1 (ANSI) handelt . Wenn Sie dieses Diagramm überprüfen (scrollen Sie nach unten zum unteren Diagramm, da es die Zeichennamen enthält), ist der Wert 0x82 (suchen Sie in der Spalte " Codepunkt " nach "82") tatsächlich das einfache Anführungszeichen für niedrige 9 , das Sie in SSMS sehen. 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 die Codierung der zurückgegebenen Zeichenfolge von Code Page 1252 auf UTF-8 ändern / konvertieren .
Wenn dies auf einer Webseite angezeigt wird, können Sie natürlich den deklarierten Zeichensatz der Seite ändern. Dies kann jedoch
Windows-1252
andere Zeichen auf der Seite beeinträchtigen, wenn bereits UTF-8-Zeichen vorhanden sind.quelle