【问题标题】:Mysql save emoji as '?'Mysql 将表情符号保存为“?”
【发布时间】: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


【解决方案1】:

我认为您需要设置参数CharacterEncoding=UTF-8,如下所示。

application.yml:

spring:
  datasource:
    hikari:
     jdbc-url: jdbc:mysql://localhost:3306/[YOUR_DB_NAME_HERE]?serverTimeZone=UTC&CharacterEncoding=UTF-8

编码愉快!

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2019-08-07
    • 2016-05-09
    • 2016-08-13
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多