web-dev-qa-db-fra.com

Comment définir les propriétés useUnicode = true et characterEncoding = utf8 sur une connexion JDBC MySQL gérée par Spring

Je construis actuellement une webapp Spring MVC et la base de données est la partie backend vitale. Pour une raison quelconque, cependant, Spring refuse de traiter les données au format UTF-8. Étant donné que les vues, les ressources et les navigateurs sont définis sur Unicode, ainsi que les tables de la base de données (et en lisant également un certain nombre de questions similaires posées), j'ai établi que le problème réside dans la connexion à la base de données.

Le pilote JDBC doit disposer de deux éléments dans connectionProperties: useUnicode (défini sur oui et characterEncoding (défini sur utf8 ). Il s'avère cependant que c'est impossible.

JDBC est un bean, et en tant que tel est configuré via un fichier XML, comme ceci:

<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/<database>" />
<property name="username" value="<not telling>" />
<property name="password" value="<not telling>" />

Cette configuration convertit tous les caractères non alphanumériques extraits de la base de données (tels que les flèches ou les lettres grecques) en points d'interrogation. Ce qui est évidemment inacceptable.

J'ai essayé plusieurs solutions: spécifié l'URL JDBC comme jdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8, joué avec my.ini fichier (et MySQL Workbench) pour forcer tout ce qui se trouve dans la base de données par défaut à utf8 charset, et quelque chose qui a causé le plus gros mal de tête: ajouter <property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />. Il s'avère qu'il est littéralement impossible de définir deux propriétés de connexion dans un seul bean, car ... il n'y a aucun caractère de séparation mentionné nulle part (le bean tentera de le lire comme essayant de définir yes;characterEncoding=utf8 comme valeur de useUnicode). Donc ma question est: comment puis-je utf8?

19
Haxton Fale

Le problème peut être dû à la spécification utf8 et non UTF-8 . De en utilisant des jeux de caractères et Unicode :

Lorsque vous spécifiez des encodages de caractères côté client, utilisez des noms de style Java. Le tableau suivant répertorie les noms des jeux de caractères MySQL et les noms de style Java correspondants ...

et utf8 correspond à UTF-8 . Essayez l'URL JDBC suivante:

jdbc: mysql: // localhost: 3306 /? useUnicode = yes & characterEncoding = UTF-8

35
hmjd

As-tu essayé:

<property name="connectionProperties">
    <props>
        <prop key="useUnicode">yes</prop>
        <prop key="characterEncoding">utf8</prop>
    </props>
</property>

Et aussi: Avez-vous essayé un simple Java (application console) qui se connecte à la base de données? L'UTF-8 fonctionne-t-il dans ce cas?

6

Notez que si vous utilisez Spring Boot, vous pouvez le faire en utilisant des propriétés dans application.properties au lieu d'avoir à ajouter des paramètres supplémentaires à vos chaînes de connexion:

Mettez ceci dans application.properties:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
6
Conor O'Neill

J'ai eu le même problème lors de l'utilisation de Spring-boot + H2 + Hibernate intégré, mais le problème était au moment de la lecture du script SQL. (data.sql) L'encodage dans la base de données était rompu à chaque fois que je lisais un caractère étranger.

L'ajout de la ligne suivante à mon application.properties a résolu le problème:

spring.datasource.sqlScriptEncoding=UTF-8

Si cela est possible, accédez à la console et ajoutez des données manuellement. Si les caractères étrangers apparaissent dans le bon sens. Cette solution peut alors fonctionner correctement pour vous.

J'ai trouvé cette solution ici:

http://ufasoli.blogspot.com/2014/07/spring-boot-jpa-broken-encoding-on.html

3
Kamil Kacperski

J'ai perdu du temps pour générer des tables utf-8. Non ci-dessus a fonctionné pour moi. Enfin, j'ai changé mon fichier de configuration mysql et cela fonctionne comme un charme. Si vous êtes sous Linux (je suis sous Ubuntu, je suis sûr qu'il existe un fichier pour Windows), ouvrez le fichier /etc/mysql/my.cnf et ajoutez le code suivant.

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

N'oubliez pas de redémarrer le service mysql.

1
maruf571