我有一个数据库,其中的表如下:
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/