2009-04-08 14 views
15

Tengo un escenario con dos bases de datos MySQL (en UTF-8), un código Java (un servicio de temporizador) que sincroniza ambas bases de datos (leyendo primero de ellos y escribir/actualizar a la segunda) y una aplicación web que permite modificar los datos cargados en la segunda base de datos.Problemas para leer/escribir datos UTF-8 en MySQL desde Java usando el conector JDBC 5.1

Todo el acceso de base de datos se realiza mediante iBatis (pero puedo detectar que tengo el mismo problema utilizando JDBC, PreparedStatement s y ResultSet s)

Cuando mi código java lee datos de primera base de datos, obtengo personajes como 'ó' cuando realmente debe ser 'ó'. Estos datos se escriben sin modificaciones en la segunda base de datos.

Más tarde, cuando veo los datos cargados en mi aplicación web, veo el carácter extraño a pesar del <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />.

Si decodificar los datos usando ...

new String(data.getBytes("UTF-8")); 

... Me visualizar correctamente los caracteres (o). Pero no puedo usar esta solución como una regla general porque cuando modifico datos usando un formulario de aplicación web, los datos no se actualizan en UTF-8 en mi segunda base de datos (a pesar de que la base de datos es UTF-8 y mi cadena de conexión usa characterEncoding, characterSetResults y useUnicode parameters).

Desde mi código Java que obtienen los siguientes valores de base de datos:

character_set_client-->utf8 
character_set_connection-->utf8 
character_set_database-->utf8 
character_set_filesystem-->binary 
character_set_results-->utf8 
character_set_server-->latin1 
character_set_system-->utf8 
character_sets_dir-->/usr/local/mysql51/share/mysql/charsets/ 

el ajuste character_set_server no puede ser cambiado y no sé lo que estoy haciendo mal !!

¿Cómo puedo leer datos UTF-8 de MySQL usando el conector JDBC (mysql-connector-java-5.1.5-bin.jar)?

¿El problema está en leer datos de la primera base de datos o escribir en la segunda base de datos?

Respuesta

5

Puede establecer la propiedad file.encoding de su JVM en UTF-8 para que toda la API sensible a la configuración regional/codificación considere Cadenas decodificadas como UTF8.

Por ejemplo, se puede establecer en su línea de comandos que lanza su aplicación Java:

java -Dfile.encoding=UTF-8 .... 

También puede hacer referencia a this SO question para una explicación completa de la configuración de Tomcat.

5

En algún punto de la cadena, los bytes codificados UTF-8 – se decodifican con Latin1. De la lista de su configuración, parece que esto está sucediendo en "character_set_server". Sin saber cómo se obtuvieron estos valores, es difícil interpretarlos.

Compruebe el valor de system property "file.encoding". Si eso no es "UTF-8", entonces necesita especificar explícitamente "UTF-8" como la codificación de caracteres siempre que descodifique bytes a caracteres. Por ejemplo, cuando llama a un constructor String con un byte[], o usa un InputStreamReader.

Es mejor especificar explícitamente las codificaciones de caracteres, en lugar de confiar en la codificación de plataforma predeterminada.

+0

debe haber; después de UTF-8. –

+0

@ScottChu Lo siento, no entiendo tu comentario. – erickson

37

Un poco tarde, pero esto le ayudará a:

DriverManager.getConnection(
      "jdbc:mysql://" + host + "/" + dbName 
      + "?useUnicode=true&characterEncoding=UTF-8", user, pass); 
+0

En la aplicación general, no crea una aplicación. Entonces no puedes pasar este parámetro ¿Hay alguna otra forma de que después de leer pueda cambiarlo? / –

Cuestiones relacionadas