Мы сохраняем строку в БД MySQL после ее кодирования с использованием Base64 с использованием hibernate.
Ниже приведен код, который делает это:
@Basic
@Column(name = "name", nullable = false)
@ColumnTransformer(read = "FROM_BASE64(name) ", write ="TO_BASE64(?)")
public String getName()
Теперь, когда я сохраняю rotebühlstr , это сохраняется в БД как cm90ZWLDvGhsc3Ry . Когда я печатаю его на терминале, это отображается как rotebühlstr , где должно быть rotebühlstr
Это проект dropwizard и config.yaml для подключения mysql выглядит следующим образом:
properties:
charSet: UTF-8
characterEncoding: UTF-8
useUnicode: true
hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.jdbc.batch_size: 100
hibernate.envers.audit_table_suffix: "_aud"
hibernate.id.new_generator_mappings: false
Описание столбца MySQL: name
varchar (200) SET CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
mysql> show variables like 'character_set_%';
+--------------------------+---------------------------------------
--------------------+
| 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 | latin1
|
| character_set_system | utf8
|
| character_sets_dir | /usr/local/mysql-5.7.23-macos10.13-
x86_64/share/charsets/ |
+--------------------------+---------------------------------------
--------------------+
8 rows in set (0.01 sec)
Замечание:
В локальных настройках моего коллеги все работает нормально. Там,
java / hibernate обрабатывает входную строку в латинице 1, а не в UTF-8.
Итак, rotebühlstr кодируется в БД как cm90ZWL8aGxzdHI = и декодируется
правильно как rotebühlstr .
^ Это происходило из-за разницы в character_set_server. Это было установлено как latin1 в моем местном и как utf-8 в местном в коллеге.
Что мы уже пробовали:
- Попытка отправки "Accept-Charset" как latin1. Не сработало.
- Имеется файл config.yaml для изменения настроек кодировки для mysql. Не работал
Что я могу сделать сейчас:
Я могу написать слой-обертку для кодирования и декодирования и прекратить использование @ColumnTransformer. Таким образом, проблема может быть решена.
Спасибо.