Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible d'insérer des symboles non latins dans MySQL

En UTF-8, Упячка devrait en fait être représenté par \x423\x43F\x44F\x447\x43A\x430 . Le \xD0\xA3\xD0\xBF\xD1\x8F... implique qu'ils ont été codés de manière incorrecte à l'aide de la norme ISO-8859-1.

Voici un extrait de test qui le prouve :

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

Qui imprime

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

Votre problème doit donc être résolu une étape avant. Étant donné que vous parlez d'une application Web Java et que cette chaîne résulte probablement d'une entrée utilisateur, êtes-vous sûr d'avoir pris soin des encodages de requête et de réponse HTTP ? Tout d'abord, dans JSP, vous devez ajouter ce qui suit en haut du JSP :

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

Cela rend non seulement la page en UTF-8, mais définit également implicitement un HTTP Content-Type en-tête de réponse indiquant au client que la page est rendue en UTF-8, afin que le client sache qu'il doit afficher tout contenu et traiter tous les formulaires en utilisant le même encodage.

Maintenant, la partie requête HTTP, pour les requêtes GET, vous devez configurer le servletcontainer en question. Dans Tomcat par exemple, il s'agit de définir le URIEncoding attribut du connecteur HTTP dans /conf/server.xml en conséquence. Pour les requêtes POST, cela devrait déjà être pris en charge par le client (navigateur Web) suffisamment intelligent pour utiliser le codage de réponse spécifié dans le JSP. Si ce n'est pas le cas, vous devrez apporter un Filter qui vérifie et ensembles l'encodage de la requête.

Pour plus d'informations générales, vous pouvez trouver cet article utile.

En dehors de tout cela, MySQL a un autre problème avec les caractères Unicode. Il ne prend en charge que les caractères UTF-8 jusqu'à 3 octets , pas 4 octets. En d'autres termes, seule la plage BMP de 65535 caractères est prise en charge, à l'extérieur non. PostgreSQL par exemple le supporte entièrement. Cela ne nuira peut-être pas à votre application Web, mais c'est certainement quelque chose à garder à l'esprit.