Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Bei Verwendung von Entity Framework mit MySQL werden Unicode-Zeichen durch einfache Zeichen ersetzt

MySQL ermöglicht die Konfiguration verschiedener Aspekte der Client-Server-Kommunikation (gemäß der 10.4 Verbindungszeichensätze und Sortierungen Dokumentation):

  • Kodierung der Quelle (d. h. Client):character_set_client
  • Ziel-(d. h. Server-)Kodierung:character_set_connection
  • Zurückgegebene Daten und Metadaten:character_set_results

Ich vermute, dass angenommen wird, dass die Quellcodierung, die von einer Microsoft-Technologie stammt, UTF-16 Little Endian ist.

Wie bei den anderen beiden, dem Connector/ NET Connection-String-Optionsreferenz Dokumentationsstatus:

Der Verbindung zu MySQL muss mitgeteilt werden, dass die Zielcodierung UTF-8 ist (was Ihre MySQL-Spalten verwenden). MySQL geht derzeit davon aus, dass Sie Nicht-Unicode-Strings senden, was effektiv dasselbe tut wie die Konvertierung in VARCHAR in SQL Server unter der Annahme, dass die durch die Standardsortierung der aktuellen Datenbank angegebene Codepage 1252 ist (Windows-Codepage 1252 wird allgemein als „ANSI ", auch wenn das technisch ist falscher Name).

Im Folgenden wird das Verhalten in SQL Server gezeigt, wenn der Zeichenfolge kein Großbuchstabe „N“ vorangestellt wird:

SELECT 'α'; -- Database's default Collation = Latin1_General_100_CI_AS_SC
-- a

SELECT 'α'; -- Database's default Collation = Hebrew_100_BIN2
-- ?

Versuchen Sie Folgendes, um dies zu beheben:

  1. Der erste Versuch sollte darin bestehen, Ihrer Verbindungszeichenfolge Folgendes hinzuzufügen, um Zeichendaten als UTF-8 an MySQL zu senden (dies sollte nur character_set_connection setzen ):

    CharSet=utf8;
    

    Beispiel für eine vollständige Verbindungszeichenfolge hier

  2. Der zweite Versuch sollte darin bestehen, bei der ersten Verbindung einen SQL-Befehl zu senden, um die Variable auf Sitzungsebene festzulegen, die die Zielkodierung steuert:

    SET character_set_connection = utf8;
    

Weitere Informationen finden Sie unter:

MySQL-Zeichensatz/Collate

Laut dem Abschnitt "utf8 Collations" dieser Seite wäre es viel besser, utf8_unicode_ci zu verwenden für die Sortierung anstelle von utf8_general_ci (um es klarzustellen, diese Empfehlung hat nichts mit dem Problem der Zeichenkonvertierung zu tun, das hier behandelt wird).

P.S. Diese Frage/Antwort hat ein begleitendes Q&A auf DBA.StackExhange:

Warum erhalte ich falsche Zeichen, wenn ich eine Base64-Zeichenfolge in NVARCHAR in SQL Server decodiere?