reservados mysql_real_escape_string insertar especiales caracteres apostrofe acentos java mysql unicode encoding

java - insertar - mysql_real_escape_string



No se pueden insertar símbolos no latinos en MySQL (2)

Estoy escribiendo una aplicación web usando MySQL versión 5.1.45, Tomcat 5.5.28 e Hibernate 3

Cuando intento guardar una cadena que contiene caracteres que no son latinos (por ejemplo, Упячка), ocurre un error:

1589 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1366, SQLState: HY000 1589 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Incorrect string value: ''/xD0/xA3/xD0/xBF/xD1/x8F...'' for column ''name'' at row 1

Configuración de conexión de Hibernate

<property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/E2012?characterEncoding=UTF8&amp;useUnicode=true</property> <property name="connection.username">***</property> <property name="connection.password">***</property> <property name="hibernate.connection.charSet">UTF8</property>

MySQL config My.cnf

[client] default-character-set=utf8 [mysqld] default-character-set=utf8

Incluso el nombre del conjunto de consultas utf-8 no resuelve el problema

¡Gracias por la ayuda!


En UTF-8, Упячка debería representarse como /x423/x43F/x44F/x447/x43A/x430 . El /xD0/xA3/xD0/xBF/xD1/x8F... implica que están incorrectamente codificados con ISO-8859-1.

Aquí hay un fragmento de prueba que prueba esto:

String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1. for (char c : s.toCharArray()) { System.out.printf("//x%X", (int) c); }

Qué impresiones

/xD0/xA3/xD0/xBF/xD1/x8F/xD1/x87/xD0/xBA/xD0/xB0

Entonces su problema debe ser resuelto un paso antes. Ya que está hablando de una aplicación de Java y esta cadena es probablemente el resultado de la entrada del usuario, ¿está seguro de que se ha ocupado de las codificaciones de solicitud y respuesta HTTP? Primero, en JSP, debe agregar lo siguiente a la parte superior de JSP:

<%@ page pageEncoding="UTF-8" %>

Esto no solo representa la página en UTF-8, sino que también establece implícitamente un encabezado de respuesta de Content-Type HTTP que indica al cliente que la página se procesa usando UTF-8, de modo que el cliente sepa que debe mostrar cualquier contenido y procesar cualquier formas usando la misma codificación.

Ahora, la parte de solicitud HTTP, para las solicitudes GET, necesita configurar el servletcontainer en cuestión. En Tomcat, por ejemplo, se trata de configurar el atributo URIEncoding del conector HTTP en /conf/server.xml en consecuencia. Para las solicitudes POST, el cliente (webbrowser) ya debe ocuparse de que sea lo suficientemente inteligente como para usar la codificación de respuesta tal como se especifica en el JSP. Si no es así, deberá ingresar un Filter que verifique y establezca la codificación de la solicitud.

Para obtener más información general, puede encontrar útil este artículo .

Aparte de todo esto, MySQL tiene otro problema con los caracteres Unicode. Solo admite caracteres UTF-8 de hasta 3 bytes , no 4 bytes. En otras palabras, solo se admite el rango BMP de 65535 caracteres, afuera no. PostgreSQL, por ejemplo, lo admite completamente. Esto puede no perjudicar su aplicación de Internet, pero esto es algo que debemos tener en cuenta.


Intente usar UTF-8 para el paramotor Charactering en su URL JDBC, en lugar de UTF8 (observe el guion).

Eso me pasó antes.