2012-02-13 4 views
2

J'ai eu des problèmes pour connecter une application Grails à une base de données MySQL hébergée sur le serveur RDS d'Amazon. Cela fonctionnait bien, je me suis rendu compte que les utilisateurs en Russie entraient des caractères cyrilliques dans ma forme, ce qui a entraîné la base de données MySQL montrant les données comme ????????.Connexion à la base de données MySQL UTF-8 avec Grails

Donc, j'ai converted the data in the database from Latin1 to UTF-8. (pourquoi oh pourquoi n'est pas UTF-8 par défaut?)

J'ai ajouté "? UseUnicode = yes & CharacterEncoding = UTF-8" à la fin de mon JDBC chaîne de connexion:

jdbc:mysql://myserver.amazonaws.com/mydatabase?useUnicode=yes&characterEncoding=UTF-8 

maintenant, quand Grails se connecte à ma base de données, je reçois l'erreur

java.io.StreamCorruptedException: en-tête de flux incorrect: C2ACC3AD à JAV a.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:800) à java.io.ObjectInputStream. (ObjectInputStream.java:297)

Une possibilité que je l'ai vu décrit comme une résolution à cette avec d'autres La structure de la base de données consiste à exécuter la connexion à la base de données

SET NAMES UTF8 

Immédiatement après la connexion à la base de données. Cependant, je ne sais pas comment forcer Grails à faire cela, parce que Grails gère son processus de connexion de base de données sous le capot. Des idées?

+3

L'URL JDBC mise à jour devrait être tout ce dont vous avez besoin. Il semble suspicieux que certaines données ont été sérialisées en tant qu'objet dans la base de données à un moment donné, et que ces données ne sont plus valides. Cette exception se produit-elle uniquement pour les requêtes sur une certaine classe de domaine? –

+0

OUI. C'était ça. J'avais une classe de domaine qui stockait un peu de méta-données comme une carte de hachage sérialisée. Une fois que j'ai défini toute la colonne de données sur null, le problème a été résolu. Maintenant, je viens de comprendre comment repousser ces métadonnées avec quelque chose de mieux ... Merci! –

+0

Veuillez répondre à votre propre question, puis l'arrêter en indiquant "non traité". – Danack

Répondre

0

Pour répondre à ma propre question, ce problème a été causé par une classe de domaine qui stockait un peu de méta-données en tant que HashMap. Ces données ont été, à leur tour, sérialisées dans la base de données. Lorsque la base de données a été déplacée de LATIN-1 à UTF-8, ces données sérialisées ont été endommagées en raison de la modification du codage de caractères. Lorsque les données ont été accédées, l'application a alors vomi de la manière décrite ci-dessus.

Une fois que j'ai manuellement défini toutes les données dans cette colonne à null, le problème a été résolu. En pratique de codage, il est probablement préférable d'éviter le raccourci d'utiliser HashMaps dans vos objets de domaine.

Questions connexes