Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ao usar o Entity Framework com MySQL, os caracteres Unicode são substituídos por caracteres básicos


O MySQL permite configurar vários aspectos da comunicação cliente-servidor (de acordo com o 10.4 Conjuntos de caracteres de conexão e agrupamentos documentação):
  • Codificação de origem (ou seja, cliente):character_set_client
  • Codificação de destino (ou seja, servidor):character_set_connection
  • Dados e metadados retornados:character_set_results

Suponho que se supõe que a codificação de origem, proveniente de uma tecnologia da Microsoft, seja UTF-16 Little Endian.

Quanto aos outros dois, o Connector/ Referência de opções de cadeia de conexão NET documentação afirma:

A conexão com o MySQL precisa ser informada de que a codificação de destino é UTF-8 (que é o que suas colunas do MySQL estão usando). O MySQL está atualmente assumindo que você está enviando strings não Unicode, efetivamente fazendo a mesma coisa que convertendo para VARCHAR no SQL Server, supondo que a página de código especificada pelo Collation padrão do banco de dados atual seja 1252 (a página de código do Windows 1252 é comumente chamada de "ANSI ", mesmo que seja tecnicamente nome incorreto).

Veja a seguir o comportamento no SQL Server ao não prefixar a string com um "N" maiúsculo:
SELECT 'α'; -- Database's default Collation = Latin1_General_100_CI_AS_SC
-- a

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

Tente o seguinte para corrigir isso:

  1. A primeira tentativa deve ser adicionar o seguinte à sua string de conexão para enviar dados de caracteres como UTF-8 para o MySQL (isso deve apenas definir character_set_connection ):
    CharSet=utf8;
    

    Exemplo de string de conexão completa aqui

  2. A segunda tentativa deve ser enviar um comando SQL, na conexão inicial, para definir a variável de nível de sessão que controla a codificação de destino:
    SET character_set_connection = utf8;
    

Para obter mais informações, consulte o seguinte:

MySQL Charset/Collate

De acordo com a seção "utf8 Collations" dessa página, seria muito melhor usar utf8_unicode_ci para o Collation em vez de utf8_general_ci (para ser claro, esta recomendação não tem nada a ver com a questão da conversão de caracteres que está sendo tratada aqui).

P.S. Esta pergunta/resposta tem perguntas e respostas complementares no DBA.StackExhange:

Por que recebo caracteres incorretos ao decodificar uma string Base64 para NVARCHAR no SQL Server?