Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile inserire simboli non latini in MySQL

In UTF-8, Упячка dovrebbe essere effettivamente rappresentato come \x423\x43F\x44F\x447\x43A\x430 . Il \xD0\xA3\xD0\xBF\xD1\x8F... implica che sono stati codificati in modo errato utilizzando ISO-8859-1.

Ecco uno snippet di prova che lo dimostra:

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);
}

Quali stampe

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

Quindi il tuo problema deve essere risolto un passaggio prima. Dato che stai parlando di un'applicazione web Java e questa stringa è probabilmente il risultato dell'input dell'utente, sei sicuro di aver curato le codifiche delle richieste e delle risposte HTTP? Innanzitutto, in JSP, è necessario aggiungere quanto segue in cima a JSP:

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

Questo non solo esegue il rendering della pagina in UTF-8, ma imposta anche implicitamente un HTTP Content-Type intestazione della risposta che indica al client che la pagina viene visualizzata utilizzando UTF-8, in modo che il client sappia che dovrebbe visualizzare qualsiasi contenuto ed elaborare qualsiasi modulo utilizzando la stessa codifica.

Ora, la parte della richiesta HTTP, per le richieste GET è necessario configurare il servletcontainer in questione. In Tomcat, ad esempio, si tratta di impostare URIEncoding attributo del connettore HTTP in /conf/server.xml di conseguenza. Per le richieste POST questo dovrebbe essere già gestito dal client (browser web) essendo abbastanza intelligente da utilizzare la codifica della risposta come specificato nel JSP. In caso contrario, dovrai inserire un Filter che verifica e set la codifica della richiesta.

Per ulteriori informazioni di base, puoi trovare questo articolo utile.

A parte questo, MySQL ha un altro problema con i caratteri Unicode. Supporta solo caratteri UTF-8 fino a 3 byte , non 4 byte. In altre parole, è supportato solo l'intervallo BMP di 65535 caratteri, al di fuori non. PostgreSQL, ad esempio, lo supporta completamente. Questo potrebbe non danneggiare la tua applicazione web, ma è sicuramente qualcosa da tenere a mente.