【发布时间】:2018-01-03 03:31:15
【问题描述】:
我有一个带有如下表的数据库:
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 它写入 ???? 而不是我的数据。甚至要求:
select hex(longText) from atable where id=0;
显示 MariaDB 在那里用代码 3F 写符号而不是我的字母。
什么是wearg,我能用它做什么?
【问题讨论】:
-
BLOB 首字母缩写词中的“B”表示字节或二进制。字段可以保存字节(二进制)等价的数据,你不能假设是文本
-
@JacekCz,正如你在实体类中看到的那样,我将字节数组存储在那里
标签: java mysql hibernate jdbc mariadb