【问题标题】:Double Encoded UTF-8 String - MySql, Hibernate双编码 UTF-8 字符串 - MySql,Hibernate
【发布时间】:2018-09-06 11:58:15
【问题描述】:

我们在 MySQL DB 中使用 Hibernate 使用 Base64 对其进行编码后保存一个字符串。

以下是执行此操作的代码:

    @Basic
    @Column(name = "name", nullable = false)
    @ColumnTransformer(read = "FROM_BASE64(name) ", write ="TO_BASE64(?)")
    public String getName()

现在,当我保存 rotebühlstr 时,它会以 cm90ZWLDvGhsc3Ry 的形式保存在 DB 中。当我在终端上打印它时,它显示为 rotebühlstr 应该是 rotebühlstr

这是一个dropwizard项目,mysql连接的config.yaml如下:

      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 列描述:namevarchar(200) 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 正在处理 latin1 中的输入字符串,而不是 UTF-8。 因此,rotebühlstr 在 DB 中被编码为 cm90ZWL8aGxzdHI= 并被解码 正确地作为 rotebühlstr

^这是由于 character_set_server 的不同而发生的。在我的本地设置为 latin1,在同事的本地设置为 utf-8。

到目前为止我们所做的尝试:

  • 尝试将“Accept-Charset”作为 latin1 发送。没用。
  • 修改 config.yaml 文件以更改 mysql 的字符集设置。没用

我现在能做什么:

我可以编写一个用于编码和解码的包装层并停止使用@ColumnTransformer。这样问题就可以解决了。

谢谢。

【问题讨论】:

    标签: java mysql hibernate character-encoding dropwizard


    【解决方案1】:

    有一次我遇到了字符集问题,唯一可以解决问题的字符集是 utf8mb4。我记得问题出在 utf8 不支持某些字符。

    另外,更多信息,您也可以查看https://stackoverflow.com/a/43692337/2137378

    【讨论】:

    • 我们使用 utf8mb4 进行编码,使用 utf8mb4_unicode_ci 作为排序规则。它在某人的本地工作,在某些地方不起作用,所以它可能与数据库的本地设置有关。我将尝试按照答案中的建议使用 utf8mb4 和 utf8mb4_unicode_520_ci。
    • 我没有更改我的 mysql 数据库的默认设置。然后我认为它工作的时间也可能有默认设置。祝你好运
    【解决方案2】:

    它适用于您的同事,但不适用于您的终端,因为您的终端与 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 databaseshow create table 时,您将看到它何时编码错误。

    【讨论】:

    • 我尝试了你的建议。它没有用。 my.cnf 如下: [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4 # 默认 Homebrew MySQL 服务器配置 [mysqld] character_set_server = utf8mb4 collat​​ion_server = utf8mb4_general_ci # 只允许来自 localhost 的连接 bind-地址 = 127.0.0.1
    • 我停止了我的 mysql 服务器并重新启动。 show create table 为我的专栏展示了这个:namevarchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,谢谢!
    • 如果它向您显示语句中的字符集,则表示它与您连接的字符集不同。否则,字符集将被隐藏。可能在某处读取了另一个配置,将您的客户端的字符集设置为其他内容。
    • 尝试使用mysql --default-character-set=utf8mb4 打开控制台或运行show variables like 'character_set_%'; 命令查看是否有问题。 character_set_system 值是您无法以任何方式控制的值。
    • character_set_server : latin1 这是我唯一看到 latin1 的地方。我将添加显示变量的结果,例如“character_set_%”;在问题描述中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多