Черные бриллианты и вопросительные знаки сохраняются после настройки базы данных uft8mb4 - PullRequest
0 голосов
/ 30 сентября 2018

Относительно базы данных MySQL и кодировки соединения Java JDBC.База данных была преобразована в utf8mb4 и utf8mb4_unicode_ci, как показано, это результаты SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; из соединения JDBC.

+--------------------------+--------------------+
|      Variable_name       |       Value        |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

Из MySQL Workbench и терминала, подключенного напрямую к БД, я вижу символ Unicodeí с его правильным шестнадцатеричным значением c3 ad

+------------------------------+
| HEX(location.name)           |
+------------------------------+
| C3AD                         |
+------------------------------+

Настройки соединения JDBC: useUnicode=true&characterEncoding=UTF-8

Использование HikariCP с конфигурацией

config.addDataSourceProperty("useUnicode", "true"); config.addDataSourceProperty("characterEncoding", "utf-8"); config.setConnectionInitSql("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");

Использование mysql-connector-java:8.0.11

Из результатов запроса к рассматриваемой таблице с использованием соединения JDBC символ í возвращается как в Postman.И ? возвращается как ? в Почтальоне.

Что заставляет меня полагать, что мое соединение во время чтения не UTF-8 в соответствии с stackoverflow.com / questions / 38363566 как мне это обнаружить?

База данных и приложение были сброшены для применения настроек, если это было необходимо.

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

В дополнение к получению помощи от VGR я также использовал обычный PrintWriter для отправки ответов, которые не допускают кодирование UTF-8.Вместо

PrintWriter out = response.getWriter();
out.println(res);
out.flush();

Заменено на

response.getOutputStream().write(res.toString().getBytes("UTF-8"));
0 голосов
/ 11 октября 2018

"í символ возвращается как " - это проблема, отличная от "? возвращается как ?"

Первая обычно возникает, когда байт (ы) для í не были закодированы как UTF-8.Обратите внимание, что в MySQL utf8mb3 и utf8mb4 идентичны для правильной кодировки этого символа и всех других европейских символов.Исправление соединения (как обсуждалось в VGR), вероятно, не исправит его.Черные бриллианты появляются только в том случае, если в браузере не установлен UTF-8 (Unicode).

«Куча пу» доступна только в utf8mb4, а не в utf8mb3.Таким образом, если у клиента правильно указан шестнадцатеричный F09F92A9, то, вероятно, проблема связана с параметрами соединения (см. VGR).

(Более подробное обсуждение приведено в указанной вами ссылке.)

0 голосов
/ 30 сентября 2018

characterEncoding = utf-8 несовместимо с utf8mb4.Вместо этого используйте character_set_server=utf8mb4 в своем URL JDBC или config.addDataSourceProperty("character_set_server", "utf8mb4");.Ни в коем случае не используйте кодировку символов.

Из руководства разработчика MySQL Connection / J → Использование наборов символов → Настройка кодировки символов :

… для использования4-байтовый набор символов UTF-8 с Connector / J, настройте сервер MySQL на character_set_server=utf8mb4 и оставьте characterEncoding в строке подключения Connector / J.

И прямо под этим:

Предупреждение

Чтобы использовать для соединения набор символов utf8mb4, сервер ДОЛЖЕН быть настроен на character_set_server=utf8mb4;если это не так, когда UTF-8 используется для characterEncoding в строке подключения, он сопоставляется с именем набора символов MySQL utf8, которое является псевдонимом для utf8mb3.

...