java - 使用 Hibernate 4 将 UTF-8 写入 MariaDB 和 MySQL 中的 BLOB

标签 java mysql hibernate jdbc mariadb

我有一个数据库,其中的表如下:

CREATE DATABASE `test_db` /*!40100 DEFAULT CHARACTER SET utf8 */;

CREATE TABLE `atable` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `shortText` varchar(255) DEFAULT NULL,
  `longText` blob,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

存在于 MySQL (5.7.18-0ubuntu0.16.04.1) 和 MariaDB (10.1.23-MariaDB) 服务器上。我正在使用 Hibernate 从我的 Java 应用程序写入 UTF-8 数据。实体对象如下所示:

@Entity(name = "atable")
public class AClass{
  @Id
  @Column(name = "id", unique = true)
  @GeneratedValue
  Long id;
  @Column
  private String shortText; //also exists setter and getter, of course
  private byte[] longText;    
  public void setLongText(String s){this.longText = (s!=null)?s.getBytes():null;}
  public String getLongText(){return this.longText!=null?new String(longText):null;}
}

对于这两个数据库,我都使用 JDBC 连接 url:

jdbc:mysql://localhost:3306/app_db?useUnicode=true&characterEncoding=utf8

当我将 UTF-8 数据写入 MySQL 时,它工作正常。

但是当我将其写入 MariaDB 时,它仅将 UTF-8 存储到 varchar 中,但将 blob 写入 ?????? 代替我的数据。偶要求: 从 id=0 的表中选择十六进制(longText); 显示 MariaDB 用代码 3F 写入符号而不是我的字母。

Wearg是什么以及我可以用它做什么?

最佳答案

s.getBytes() 保证将文本编码为 UTF-8。 new String(longText) 保证将字节解码为 UTF-8。

这两种方法都使用系统的默认字符集,在 Windows 系统上不是 UTF-8。

为保证正确操作,请指定字符集:

s.getBytes(StandardCharsets.UTF_8)
new String(longText, StandardCharsets.UTF_8)

关于java - 使用 Hibernate 4 将 UTF-8 写入 MariaDB 和 MySQL 中的 BLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45350170/

相关文章:

java - 使用 containsAll() 比较两个 ArrayList

php - 等效于 PHP 格式 ('%R%a.%h' );在 MySQL 中

java - 实体更新导致错误: cascade ="all-delete-orphan" was no longer referenced by the owning entity

java - 如何使用 Hibernate 保存两个具有一对一关系的类?

java - Hibernate 搜索结果太多

java - 从应用程序内永久添加按钮

java - 将 Libgdx 滚动条添加到 TextArea

java - MySQL limit子句是如何实现的

php - 使用多复选框将具有相同 id 的多个项目添加到表中

MySQL 子查询/连接的替代方案