Подключение к базе данных MySQL UTF-8 с помощью Grails - PullRequest
2 голосов
/ 13 февраля 2012

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

Итак, я преобразовал данные в базе данных из Latin1 в UTF-8. (почему UTF-8 не используется по умолчанию?)

Я добавил «? UseUnicode = yes & characterEncoding = UTF-8» в конец строки подключения JDBC:

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

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

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

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

SET NAMES UTF8 

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

1 Ответ

0 голосов
/ 20 марта 2013

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

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

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

...