2010-09-30 22 views
9

Tengo una declaración preparada:Java PreparedStatement UTF-8 problema de carácter

PreparedStatement st; 

y en mi código Trato de utilizar el método st.setString.

st.setString(1, userName); 

El valor de userName es şakça. Los métodos setString cambian 'şakça' a '? akça'. No reconoce los caracteres UTF-8. ¿Como puedó resolver esté problema?

Gracias.

+1

¿Qué base de datos estás utilizando?¿Y está configurado para aceptar Unicode (o lo que sea que necesite para şakça) en esa columna? – Thilo

Respuesta

35

La cantidad de formas en que se puede estropear es bastante impresionante. Si estás usando MySQL, trate de añadir un parámetro characterEncoding=UTF-8 hasta el final de su URL de conexión JDBC:

jdbc:mysql://server/database?characterEncoding=UTF-8

También debe comprobar que el conjunto de caracteres de la tabla/columna es UTF-8.

+1

? CharacterEncoding = UTF-8 no funciona para mí. Intenté? CharacterEncoding = utf8 y funciona. – user4757345

+0

Ambos "funcionaron" para mí. La diferencia para mí fue que "utf8" carecía de muchos símbolos, mientras que "UTF-8" los cubría a todos. –

+0

funciona como un encanto – YyYo

3

setString métodos cambios 'şakça' a '? Akca'

¿Cómo sabe que setString cambia esto? ¿O ve el contenido en la base de datos y decide esto?

Podría ser que la base de datos no esté configurada para UTF-8, o simplemente que la herramienta que utiliza para ver los contenidos de la base de datos (SQL * PLUS para Oracle ...) no sea capaz de reproducir UTF-8 .

7

Cuando una base de datos cambia un carácter a ?, significa simplemente que el punto de código del carácter en cuestión está completamente fuera del rango para la codificación de caracteres que la tabla está configurada para usar.

En cuanto a la causa del problema: la ç se encuentra dentro ISO-8859-1 gama y tiene exactamente el mismo punto de código como en UTF-8 (U+00E7). Sin embargo, el punto de código UTF-8 de ş se encuentra completamente fuera del rango de ISO-8859-1 (U+015F mientras que ISO-8859-1 solo sube a U + 00FF). El DB no persistirá el carácter y lo reemplazará por ?.

Entonces, sospecho que su tabla DB todavía está configurada para usar ISO-8859-1 (o en una de las otras codificaciones ISO-8859 compatibles donde ç tiene el mismo punto de código que en UTF-8).

La API Java/JDBC está haciendo su trabajo perfectamente bien con respecto a la codificación de caracteres (Java usa Unicode hasta el final) y la codificación de conexión JDBC DB también está configurada correctamente. Si Java/JDBC tendría incorrectamente utilizados ISO-8859-1, entonces el resultado PERSISTED habría sido Åakça (la ş existen de bytes 0xC5 y 0x9F que representa Å y a en ISO-8859-1 y la ç existen de bytes 0xC3 y 0xA7 que representa à y § en ISO-8859-1).

0

puede utilizar la consulta siguiente para establecer cadenas de Unicode en la declaración preparada. PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle st.setString(1, userName);

Cuestiones relacionadas