【发布时间】:2021-09-02 04:42:18
【问题描述】:
我有一个带有 mysql (mysql-connector-java) 的 spring boot 项目 (2.4.5),当我尝试使用 emoji 保存文本时,数据库保存为问号 (?)。
经过一番搜索,我已经尝试更改数据库和表编码:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;
但没有成功。
另外,尝试用这个设置 Hikari 连接:
spring:
datasource:
hikari:
connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
这是我的休眠日志:
2021-06-17 08:12:55,244 DEBUG [http-nio-8080-exec-2] org.hibernate.engine.jdbc.spi.SqlStatementLogger:
insert
into
post
(img_url, posted_date, text, id)
values
(?, ?, ?, ?)
Hibernate:
insert
into
post
(img_url, posted_date, text, id)
values
(?, ?, ?, ?)
2021-06-17 08:12:55,244 TRACE [http-nio-8080-exec-2] org.hibernate.type.descriptor.sql.BasicBinder: binding parameter [1] as [VARCHAR] - [null]
2021-06-17 08:12:55,245 TRACE [http-nio-8080-exec-2] org.hibernate.type.descriptor.sql.BasicBinder: binding parameter [2] as [TIMESTAMP] - [2021-06-17T08:12:55.197196]
2021-06-17 08:12:55,245 TRACE [http-nio-8080-exec-2] org.hibernate.type.descriptor.sql.BasicBinder: binding parameter [3] as [VARCHAR] - [????]
2021-06-17 08:12:55,245 TRACE [http-nio-8080-exec-2] org.hibernate.type.descriptor.sql.BasicBinder: binding parameter [4] as [BIGINT] - [105]
和表 DDL:
-- post definition
CREATE TABLE `post` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`created_by` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_date` datetime(6) DEFAULT NULL,
`last_modified_by` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`last_modified_date` datetime(6) DEFAULT NULL,
`img_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`text` text CHARACTER SET utf8mb4,
`user_id` bigint(20) DEFAULT NULL,
`posted_date` datetime(6) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK72mt33dhhs48hf9gcqrq4fxte` (`user_id`),
CONSTRAINT `FK72mt33dhhs48hf9gcqrq4fxte` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `FKbbelhmvq5tsjie489mqfqsqao` FOREIGN KEY (`id`) REFERENCES `timeline` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
实体:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import java.time.LocalDateTime;
import java.util.List;
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Post extends Timeline {
private String text;
private String img_url;
private LocalDateTime postedDate;
@OneToMany(mappedBy = "post")
private List<PostComment> comments;
public Post(User loggedUser, String text, String imgURL, LocalDateTime now) {
this.setUser(loggedUser);
this.setText(text);
this.setImg_url(imgURL);
this.setPostedDate(now);
this.setType(TimelineTypeEnum.POST);
}
@Override
public String toString() {
return "Post{" +
"text='" + text + '\'' +
", img_url='" + img_url + '\'' +
", postedDate=" + postedDate +
", comments=" + null +
'}';
}
}
【问题讨论】:
-
你可以添加你的实体映射吗?
-
@AmineABBAOUI,当然!已更新。
-
“带有表情符号的文字”在哪里?
-
我从我的 API(控制器)上的前端收到文本。可以是任何表情符号。
-
你可以在前面给我这个文本的例子,然后调试你的控制器来验证它是否是相同的内容?
标签: java mysql spring hibernate emoji