sql >> Base de Datos >  >> RDS >> Mysql

Al usar Entity Framework con MySQL, los caracteres Unicode se reemplazan con caracteres básicos

MySQL permite configurar varios aspectos de la comunicación cliente-servidor (según el 10.4 Intercalaciones y conjuntos de caracteres de conexión documentación):

  • Codificación de origen (es decir, cliente):character_set_client
  • Codificación de destino (es decir, servidor):character_set_connection
  • Datos y metadatos devueltos:character_set_results

Supongo que se supone que la codificación de origen, proveniente de una tecnología de Microsoft, es UTF-16 Little Endian.

En cuanto a los otros dos, el Connector/ Referencia de opciones de cadena de conexión NET la documentación dice:

Se debe informar a la conexión a MySQL que la codificación de destino es UTF-8 (que es lo que usan sus columnas de MySQL). MySQL actualmente asume que está enviando cadenas que no son Unicode, haciendo efectivamente lo mismo que convertir a VARCHAR en SQL Server, asumiendo que la página de códigos especificada por la intercalación predeterminada de la base de datos actual es 1252 (la página de códigos de Windows 1252 se conoce comúnmente como "ANSI ", incluso si eso es un técnicamente nombre inexacto).

A continuación se muestra el comportamiento en SQL Server al no anteponer la cadena con una "N" mayúscula:

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

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

Prueba lo siguiente para arreglar esto:

  1. El primer intento debe ser agregar lo siguiente a su cadena de conexión para enviar datos de caracteres como UTF-8 a MySQL (esto debería simplemente configurar character_set_connection ):

    CharSet=utf8;
    

    Ejemplo de cadena de conexión completa aquí

  2. El segundo intento debe ser enviar un comando SQL, en la conexión inicial, para establecer la variable de nivel de sesión que controla la codificación de destino:

    SET character_set_connection = utf8;
    

Para obtener más información, consulte lo siguiente:

MySQL Charset/Collate

Según la sección "Colaciones utf8" de esa página, sería mucho mejor usar utf8_unicode_ci para la intercalación en lugar de utf8_general_ci (para ser claros, esta recomendación no tiene nada que ver con el problema de conversión de caracteres que se trata aquí).

PD Esta pregunta/respuesta tiene un complemento de preguntas y respuestas en DBA.StackExhange:

¿Por qué obtengo caracteres incorrectos al decodificar una cadena Base64 a NVARCHAR en SQL Server?