Не получается настроить кодировку в MySQL

175
02 марта 2018, 14:31

Я передаю JsonObject, состоящий из объектов типа String, из android-приложения на сервер через POST-запрос и сохраняю переменные в MySQL c помощью JDBC. Если в переменных String содержатся только английские буквы, всё работает правильно. Но при попытке сохранить кириллицу или символы "Ç", "ẞ" и т.д. сервер выдаёт ошибку:

Incorrect string value: '\xC2\x92 \xC3\x91\xC2...' for column 'contacts' at row 1

Что я уже сделал:

  • Установил Text file encoding в UTF-8 в Eclipse->Window->Preferences->Workspace
  • Установил UTF-8 как Default encoding для всех типов контента в Eclipse->Window->Preferences->General->Content Types
  • Заменил DB_URL на "jdbc:mysql://localhost/YOURWAY?useUnicode=yes&characterEncoding=UTF-8" До этого действия, MySQL сохранял кириллицу, но частично, в виде: "Доб??о??е ут??о"

UPDATE:

  • Заменил кодировку всех таблиц и базы данных командами: ALTER DATABASE название_базы CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; и ALTER TABLE название_таблицы CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • Заменил DB_URL на "jdbc:mysql://localhost/YOURWAY?useUnicode=yes&characterEncoding=UTF-8&character_set_server=utf8mb4"

Ошибка больше не вылетает, но теперь при вызове SELECT * FROM название_базы MySQL выдаёт что-то вроде "ÃÂðòðù ôÃÂÃÂöøÃÂÃÂ!". При этом, если получить эти данные на Android чере GET-запрос, на Android снова отображается "Доб??о??е ут??о".

Что я упускаю из виду?

Answer 1

Итак, я нашёл проблему. Это касалось вовсе не MySQL.

Проблема была в библиотеке okhttp в составе retrofit2, которые я использую для общения с сервером. Okhttp не позволяет напрямую передавать кириллицу в GET и POST запросах. Чтобы обойти это ограничение, я добавил кодирование перед передачей данных на сервер с помощью URLEncoder.encode(строка, "UTF-8"); и декодирование после приема данных с сервера с помощью URLDecoder.decode(строка, "UTF-8");. Кроме того, понадобилось увеличить длину всех столбцов VARCHAR в MySQL в три раза (т.к. один символ кириллицы в String соответствует трём символам в UTF-8). Надеюсь, мой опыт поможет кому-то ещё.

READ ALSO
Удалить поля в MySQL с условием

Удалить поля в MySQL с условием

Добрый деньНеобходимо удалить поля (заменить их значения на NULL), размер которых меньше 10 символов)

186
Удаление последнего символа в MySQL

Удаление последнего символа в MySQL

Добрый день! Возник вопрос, как удалить последний символ (при условии, что этот символ - пробел) в строке (база MySQL)?

292
как связать Angular 2+ с базами данных?

как связать Angular 2+ с базами данных?

Как angular 2+ взаимодействовать(запись, чтение, обнова) с базой данных (например MySQL)? Как развернуть базу на внутреннем сервере приложения? (тот...

140
Как реализовать остановку потока перед запуском нового его экземпляра?

Как реализовать остановку потока перед запуском нового его экземпляра?

Помогите разрулить потокиЯ не буду предоставлять код, мне нужна просто идея

190