【发布时间】: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