为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕运维8079593 2021-09-03 13:03:57
我们在使用 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: falseMySQL 列描述: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                                                   观察:在我同事的本地设置中,这工作正常。在那里,java/hibernate 正在处理 latin1 而不是 UTF-8 中的输入字符串。因此,rotebühlstr在 DB 中编码为cm90ZWL8aGxzdHI=并正确解码为rotebühlstr。^这是由于 character_set_server 的差异而发生的。它在我的本地设置为 latin1,在同事本地设置为 utf-8。到目前为止我们尝试过的:尝试将“接受字符集”作为 latin1 发送。没用。修改 config.yaml 文件以更改 mysql 的字符集设置。没用我现在可以做什么:我可以编写一个用于编码和解码的包装层并停止使用@ColumnTransformer。这样问题就可以解决了。
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

它适用于您的同事,但不适用于您的终端,因为您的与 latin1 字符集连接,即使数据库和字段可能在 utf8mb4 中。


您想找到您的 mysql 配置并在它们的部分中添加这些选项。如果它们丢失,则创建这些部分。


[mysql]

default-character-set=utf8mb4


[client]

default-character-set=utf8mb4


[mysqld]

character_set_server = utf8mb4

collation_server = utf8mb4_general_ci

退出任何客户端,重新启动服务器,你应该没问题。同样从现在开始,当你执行 ashow create database或者show create table你会看到它是错误的编码。


查看完整回答
反对 回复 2021-09-03
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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

查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信