2009-06-02 19 views
13

Tengo una antigua base de datos MySQL con codificación establecida en UTF-8. Estoy usando el marco de Entidad Ado.Net para conectarme a él.MySQL C# Problemas de codificación de texto

La cadena que recupero de ella tiene caracteres extraños cuando se esperan caracteres iguales.

Por ejemplo: "ë" es "Ã" ".

Pensé que podía hacer esto bien al convertir de UTF8 a UTF16.

return Encoding.Unicode.GetString(    
      Encoding.Convert(
      Encoding.UTF8, 
      Encoding.Unicode, 
      Encoding.UTF8.GetBytes(utf8))); 
    } 

Sin embargo, esto no cambia nada.

¿Cómo puedo obtener los datos de esta base de datos en la forma correcta?

+0

El problema es más que probable que en el almacenamiento de MySQL. ¿Cómo se ve tu mesa? – Craig

Respuesta

3

Incluso si la base de datos se establece en UTF-8 debe hacer las siguientes cosas para conseguir campos Unicode para que funcione correctamente:

  1. Asegúrese de que está utilizando un tipo de campo Unicode, como NVARCHAR o TEXTO CONJUNTO DE CARACTERES UTF8
  2. Cada vez que inserte algo en el campo debe ponerle un prefijo N con el carácter N para indicar datos Unicode como se muestra en los ejemplos siguientes
  3. Siempre que seleccione en base a datos Unicode, asegúrese de usar el prefijo N nuevamente

MySqlCommand cmd = new MySqlCommand("INSERT INTO EXAMPLE (someField) VALUES (N'Unicode Data')"); 

MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM EXAMPLE WHERE someField=N'Unicode Data'"); 

Si la base de datos no se ha configurado correctamente o que se han insertado los datos sin necesidad de utilizar el prefijo N, no será posible obtener los datos correctos fuera ya que habrá sido abatido en el Juego de caracteres Latin 1/ASCII

+0

Me temo que ese problema abatido es el caso. Las tablas están en UTF8, pero los campos son simplemente VARCHAR. ¿No hay forma de "actualizarlo" a utf8 o la codificación que sea para recuperar los datos? – Peter

+0

Extrañamente, la aplicación Ruby on Rails que usa la base de datos no parece tener ningún problema para obtener los datos correctamente – Peter

1

Intente configurar la codificación mediante la consulta "set names utf8". Puede establecer este parámetro en la configuración de mysql también.

1

Como otros han dicho que esto podría ser un problema de DB, pero también podría ser causado por el uso de una versión anterior del conector .NET mysql.

Lo que realmente quería comentar era la conversión utf8 a utf16. La cadena que está tratando de convertir ya está codificada en unicode, por lo que sus caracteres "Ã" "ocupan 4 bytes (o más) y ya no son, en el momento de su conversión, una representación falsa del carácter" ë ". Esa es la razón por la cual su conversión no hace nada. Si quieres hacer una conversión como esa, creo que tendrías que codificar tu cadena utf8 como un antiguo estilo de 1 byte por cadena de caracteres, usando una página de códigos donde los valores byte de y "representan realmente la secuencia de bytes utf8 de" y luego trate los bytes de esta nueva cadena como una cadena utf8. Cosas divertidas.

32

Hay dos cosas que usted necesita hacer para apoyar UTF-8 en el marco de trabajo ADO.NET Entity (o, en general, mediante el conector de MySQL .NET):

  1. Asegúrese de que el cotejo de su La base de datos de la tabla es una intercalación UTF-8 (es decir, utf8_general_ci o una de sus relaciones)
  2. Agregue Charset=utf8; a su cadena de conexión.

    "Server=localhost;Database=test;Uid=test;Pwd=test;Charset=utf8;" 
    

No estoy seguro, pero la codificación puede ser sensible a mayúsculas; Encontré que CharSet=UTF8; no funcionó para mí.

+3

Muchas gracias ... Estaba teniendo el mismo problema ... funcionó para mí .... – Sameer

+0

ya tengo agregue esta información a connectionstring, pero no puede funcionar. – sendreams

+0

sendreams

0

gracias The Mouth of a Cow, su solución funciona pero todavía necesitamos convertir caracteres. creo que este es su problema :) y para la conversión de caracteres se puede utilizar este código

System.Text.Encoding utf_8 = System.Text.Encoding.UTF8; 

string s = "unicode"; 

//string to utf 
byte[] utf = System.Text.Encoding.UTF8.GetBytes(s); 

//utf to string 
string s2= System.Text.Encoding.UTF8.GetString(utf); 
Cuestiones relacionadas