Mysql
 sql >> Database >  >> RDS >> Mysql

Quando si utilizza Entity Framework con MySQL, i caratteri Unicode vengono sostituiti con i caratteri di base

MySQL consente di configurare diversi aspetti della comunicazione client-server (secondo 10.4 Set di caratteri di connessione e regole di confronto documentazione):

  • Codifica sorgente (ovvero client):character_set_client
  • Codifica della destinazione (ovvero del server):character_set_connection
  • Dati e metadati restituiti:character_set_results

Immagino che si presuppone che la codifica sorgente, proveniente da una tecnologia Microsoft, sia UTF-16 Little Endian.

Per quanto riguarda gli altri due, il Connector/ Riferimento alle opzioni della stringa di connessione NET la documentazione afferma:

La connessione a MySQL deve essere informata che la codifica di destinazione è UTF-8 (che è ciò che stanno usando le tue colonne MySQL). MySQL attualmente presume che tu stia inviando stringhe non Unicode, facendo effettivamente la stessa cosa della conversione in VARCHAR in SQL Server, presupponendo che la tabella codici specificata dalle regole di confronto predefinite del database corrente sia 1252 (la tabella codici di Windows 1252 viene comunemente denominata "ANSI ", anche se questo è un tecnicamente nome impreciso).

Di seguito viene illustrato il comportamento in SQL Server non anteponendo alla stringa una "N" maiuscola:

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

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

Prova quanto segue per risolvere questo problema:

  1. Il primo tentativo dovrebbe essere quello di aggiungere quanto segue alla stringa di connessione per inviare i dati dei caratteri come UTF-8 a MySQL (questo dovrebbe semplicemente impostare character_set_connection ):

    CharSet=utf8;
    

    Esempio di stringa di connessione completa qui

  2. Il secondo tentativo dovrebbe essere quello di inviare un comando SQL, al momento della connessione iniziale, per impostare la variabile a livello di sessione che controlla la codifica di destinazione:

    SET character_set_connection = utf8;
    

Per ulteriori informazioni, vedere quanto segue:

MySQL Charset/Collate

Secondo la sezione "utf8 Collations" di quella pagina, sarebbe molto meglio usare utf8_unicode_ci per la Fascicolazione invece di utf8_general_ci (per essere chiari, questa raccomandazione non ha nulla a che fare con la questione della conversione del personaggio trattata qui).

PS Questa domanda/risposta ha un compagno di domande e risposte su DBA.StackExhange:

Perché ottengo caratteri errati durante la decodifica di una stringa Base64 in NVARCHAR in SQL Server?