2012-02-13 4 views
2

У меня возникли проблемы с подключением приложения Grails к базе данных MySQL, размещенной на RDS Amazon. Он работал отлично, я понял, что пользователи в России вводят кириллические символы в мою форму, в результате чего база данных MySQL показывает данные как ????????.Подключение к базе данных MySQL UTF-8 с Grails

Итак, я converted the data in the database from Latin1 to UTF-8. (почему о, почему не UTF-8 по умолчанию?)

Я добавил "? UseUnicode = да & characterEncoding = UTF-8" до конца моего JDBC строка соединения:

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

Теперь, когда Grails подключается к базе данных, я получаю ошибку

java.io.StreamCorruptedException: неверный заголовок потока: C2ACC3AD в Явь a.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:800) на java.io.ObjectInputStream. (ObjectInputStream.java:297)

Одна из возможностей, которые я видел, как описано разрешение на это с другой рамки должны иметь подключение к базе данных

SET NAMES UTF8 

Сразу после подключения к базе данных. Однако я не знаю, как заставить Grails сделать это, потому что Grails обрабатывает процесс подключения к базе данных под капотом. Есть идеи?

+3

Обновленный URL JDBC должен быть всем, что вам нужно. Это выглядит подозрительно, так как некоторые данные в какой-то момент были сериализованы как объект в базе данных, и эти данные теперь уже недействительны. Это исключение возникает только для запросов в определенном классе домена? –

+0

ДА. Вот и все. У меня был класс домена, который хранил немного метаданных в виде сериализованной хэш-карты. После того, как я установил для всех столбцов данных значение null, проблема была исправлена. Теперь я просто выясню, как отразить эти метаданные с чем-то лучшим ... Спасибо! –

+0

Пожалуйста, ответьте на свой вопрос, а затем остановите его, показывая, что он «не задан». – Danack

ответ

0

Чтобы ответить на мой собственный вопрос, эта проблема была вызвана классом домена, в котором хранилось немного метаданных как HashMap. Эти данные, в свою очередь, были сериализованы в базе данных. Когда база данных была перенесена из LATIN-1 в UTF-8, эти сериализованные данные были повреждены из-за изменения кодировки символов. Когда данные были доступны, приложение затем вымачивалось описанным выше способом.

Как только я вручную установил все данные в этом столбце равными нулю, проблема была исправлена.

Как практика кодирования, вероятно, лучше всего избегать ярлыка использования HashMaps в ваших объектах домена.