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

No se pueden insertar símbolos no latinos en MySQL

En UTF-8, Упячка en realidad debería representarse como \x423\x43F\x44F\x447\x43A\x430 . El \xD0\xA3\xD0\xBF\xD1\x8F... implica que se han codificado incorrectamente 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);
}

Que imprime

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

Por lo tanto, su problema debe resolverse un paso antes. Dado que está hablando de una aplicación web Java y esta cadena probablemente sea 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 en 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 HTTP Content-Type encabezado de respuesta que indica al cliente que la página se representa con UTF-8, para que el cliente sepa que debe mostrar cualquier contenido y procesar cualquier formulario con la misma codificación.

Ahora, la parte de la solicitud HTTP, para las solicitudes GET, debe configurar el servletcontainer en cuestión. En Tomcat, por ejemplo, se trata de configurar URIEncoding atributo del conector HTTP en /conf/server.xml respectivamente. Para las solicitudes POST, el cliente (navegador web) ya debería encargarse de esto, ya que es lo suficientemente inteligente como para usar la codificación de respuesta como se especifica en el JSP. Si no es así, deberá traer un Filter que verifica y conjuntos la codificación de la solicitud.

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

Aparte de todo esto, MySQL tiene otro problema con los caracteres Unicode. Solo admite caracteres UTF-8 hasta 3 bytes , no 4 bytes. En otras palabras, solo se admite el rango BMP de 65535 caracteres, fuera no. PostgreSQL, por ejemplo, lo admite completamente. Es posible que esto no dañe su aplicación web, pero ciertamente es algo a tener en cuenta.