sql >> Databasteknik >  >> RDS >> Mysql

När du använder Entity Framework med MySQL ersätts Unicode-tecken med grundläggande tecken

MySQL gör det möjligt att konfigurera flera aspekter av klient-serverkommunikationen (enligt 10.4 Anslutningsteckenuppsättningar och sorteringar dokumentation):

  • Källkodning (dvs. klient):character_set_client
  • Destination (dvs. server) kodning:character_set_connection
  • Returerade data och metadata:character_set_results

Jag gissar att det antas att källkodningen, som kommer från en Microsoft-teknik, är UTF-16 Little Endian.

När det gäller de andra två, Connector/ NET Connection-String Options Reference dokumentationen säger:

Anslutningen till MySQL måste få veta att målkodningen är UTF-8 (vilket är vad dina MySQL-kolumner använder). MySQL antar för närvarande att du skickar icke-Unicode-strängar, vilket i praktiken gör samma sak som att konvertera till VARCHAR i SQL Server, förutsatt att teckentabellen som anges av standardsorteringen av den aktuella databasen är 1252 (Windows-kodsidan 1252 kallas vanligtvis "ANSI ", även om det är en tekniskt felaktigt namn).

Följande visar beteendet i SQL Server genom att inte prefixa strängen med ett versaler "N":

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

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

Försök med följande för att fixa detta:

  1. Första försöket bör vara att lägga till följande till din anslutningssträng för att skicka teckendata som UTF-8 till MySQL (detta bör bara ställa in character_set_connection ):

    CharSet=utf8;
    

    Exempel på fullständig anslutningssträng här

  2. Andra försöket bör vara att skicka ett SQL-kommando, vid den första anslutningen, för att ställa in sessionsnivåvariabeln som styr destinationskodningen:

    SET character_set_connection = utf8;
    

För mer information, se följande:

MySQL Charset/Collate

Enligt avsnittet "utf8 Collations" på den sidan skulle det vara mycket bättre att använda utf8_unicode_ci för sorteringen istället för utf8_general_ci (för att vara tydlig har denna rekommendation ingenting att göra med teckenkonverteringsfrågan som behandlas här).

P.S. Den här frågan/svaret har en följeslagare Q &A på DBA.StackExhange:

Varför får jag felaktiga tecken när jag avkodar en Base64-sträng till NVARCHAR i SQL Server?




  1. Konvertera datum till månadsnamn och år

  2. Anslut SQL Server till HubSpot CRM

  3. MySQL:Uppdaterar alla rader och sätter ett fält till 0, men sätter en rads fält till 1

  4. Att ta bort de nya Microsoft SQL Server ODBC- och OLEDB-drivrutinerna