繁体   English   中英

双编码 UTF-8 字符串 - MySql、Hibernate

[英]Double Encoded UTF-8 String - MySql, Hibernate

我们在使用 Hibernate 使用 Base64 编码后将字符串保存在 MySQL DB 中。

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

    @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项目,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 列描述: name varchar(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。

到目前为止我们尝试过的:

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

我现在可以做什么:

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

谢谢。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM