Строка UTF-8 с двойным кодированием - MySql, Hibernate - PullRequest
0 голосов
/ 06 сентября 2018

Мы сохраняем строку в БД 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. Таким образом, проблема может быть решена.

Спасибо.

Ответы [ 2 ]

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

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

Вы хотите найти свою конфигурацию mysql и добавить эти опции в их разделы. Создайте разделы, если они отсутствуют.

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci

Выйдите из любых клиентов, перезагрузите сервер, и все будет в порядке. Кроме того, теперь, когда вы делаете show create database или show create table, вы увидите, когда это неправильная кодировка.

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

У меня была проблема с кодировками один раз, и единственная кодировка, которая могла решить эту проблему, была utf8mb4. Насколько я помню, проблема возникает из-за того, что utf8 не может поддерживать некоторые символы.

Кроме того, для получения дополнительной информации вы также можете проверить https://stackoverflow.com/a/43692337/2137378.

...