spring boot 使用utf8mb4的操作

yizhihongxing

下面是详细讲解 “spring boot 使用utf8mb4的操作”的完整攻略:

什么是utf8mb4?

UTF-8 是一种针对Unicode的可变长度字符编码,也是一种前缀码。UTF-8使用一至四个字节编码UNICODE字符。在UTF-8中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节,而emoji表情等一些非常规的字符则会被编码为四个字节。然而标准UTF-8编码只允许字符长度最大为三个字节,无法表示4字节的UTF-8字符。因此 MySQL 引入了 utf8mb4 字符集来解决这个问题。

如何使用utf8mb4

1.配置MySQL数据库的utf8mb4字符集

在Spring Boot项目的application.properties文件中添加以下配置:

spring.datasource.url=jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.properties.hibernate.hbm2ddl.charset=utf8mb4
spring.jpa.properties.hibernate.connection.characterEncoding=utf-8
spring.jpa.properties.hibernate.connection.useUnicode=true

其中 mysql数据库必须是5.5.3以上的版本才能支持utf8mb4字符集。

2.指定数据库的的utf8mb4字符集

在Spring Boot的实体类中,在需要varchar类型的字段上使用@Column(columnDefinition = "nvarchar(50) character set utf8mb4")注解来指定数据库字段的字符集

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "username", columnDefinition = "nvarchar(50) character set utf8mb4")
    private String username;

    @Column(name = "password")
    private String password;
}

示例说明

1.存储emoji表情

使用utf8mb4可以轻松存储emoji表情,例如我们有以下的实体类:

@Entity
@Table(name = "emoji")
public class Emoji {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "icon", columnDefinition = "nvarchar(100) character set utf8mb4")
    private String icon;

    public Emoji() {
    }

    public Emoji(String name, String icon) {
        this.name = name;
        this.icon = icon;
    }
}

然后我们可以通过以下代码来存储一个带有emoji表情的实体:

Emoji emoji = new Emoji("smile", "this_is_a_emoji?");
emojiRepository.save(emoji);

2.读取中文字符内容

中文是不包含在ASCII字符集中的一类字符,如果我们在MySQL中使用utf8字符集存储这类字符,当读取中文字符时会出现乱码。以下是一个测试代码,演示了在MySQL中存储中文字符时出现乱码的问题:

public void test(Emoji emoji) {
    emojiRepository.save(emoji);
    Optional<Emoji> optionalEmoji = emojiRepository.findById(emoji.getId());
    if (optionalEmoji.isPresent()) {
        Emoji resultEmoji = optionalEmoji.get();
        System.out.println("表情名称:" + resultEmoji.getName());
        System.out.println("表情内容:"+resultEmoji.getIcon());
    }
}

如果在MySQL中使用utf8字符集,则会读取到乱码的结果,而使用utf8mb4字符集则可以读取到正确的结果。

总结

使用utf8mb4字符集可以解决MySQL存储emoji表情等一些非标准utf8字符时出现的问题,并且可以支持更多的字符,更好的满足多语言场景下的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 使用utf8mb4的操作 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java使用Maven BOM统一管理版本号的实现

    Java使用Maven BOM(Bill Of Materials)可以统一管理项目库依赖的版本号,避免了在POM文件中重复声明版本号的冗余问题,并且可以减轻开发者手动维护库依赖版本的工作量。 以下是Java使用Maven BOM统一管理版本号的实现攻略: 1.创建BOM项目 首先,创建一个Maven项目,称为“BOM项目”。在pom.xml文件中定义BOM…

    Java 2023年5月19日
    00
  • 使用Java实现DNS域名解析的简单示例

    下面我将为您详细讲解“使用Java实现DNS域名解析的简单示例”的完整攻略。 什么是DNS? DNS(Domain Name System)是一种将域名转换为IP地址的互联网服务。DNS将人类可读的域名转换为机器可读的IP地址。例如,www.baidu.com域名会被DNS服务器解析为IP地址,例如:220.181.110.6。 Java实现DNS域名解析 …

    Java 2023年5月19日
    00
  • Java源码刨析之ArrayDeque

    Java源码刨析之ArrayDeque Java中的ArrayDeque是一种基于动态数组的双端队列数据结构。本篇文章将与读者一起深入分析Java中ArrayDeque的源代码,从中学习这种数据结构的实现原理。 容量扩充 由于使用动态数组来存储队列中的元素,因此在添加元素时,需要判断是否需要扩展数组的容量。容量扩充的代码实现如下: private void …

    Java 2023年5月26日
    00
  • eclipse/intellij idea 远程调试hadoop 2.6.0

    下面是关于“eclipse/intellij idea 远程调试hadoop 2.6.0”的完整攻略: 简介 在分布式系统开发过程中,我们可能需要对运行在远端的Hadoop集群上的代码进行调试。这时,我们就需要进行远程调试。本文将介绍如何使用Eclipse/IntelliJ IDEA进行远程调试Hadoop 2.6.0,以及具体的步骤和示例。 调试前准备 配…

    Java 2023年5月20日
    00
  • 使用sharding-jdbc实现水平分库+水平分表的示例代码

    使用 Sharding-JDBC 实现水平分库+水平分表的步骤如下: 1. 创建共享库(shared database)的配置文件 定义数据库名称以及访问方式,如 JDBC URL,数据源等,同时还需要指定共享库所要分片策略和插件配置。 示例代码如下: # shardingsphere datasource config spring: sharding: …

    Java 2023年5月20日
    00
  • 使用sts工具、SpringBoot整合mybatis的详细步骤

    下面是详细步骤: 准备环境 JDK8+ Maven3.0+ SpringBoot2.0+ STS(Spring Tool Suite)/ IntelliJ IDEA 创建SpringBoot项目 使用STS或者IntelliJ IDEA创建一个新的SpringBoot项目,选择Web依赖,根据个人喜好选择模板。 在pom.xml中添加MyBatis依赖: x…

    Java 2023年5月20日
    00
  • Java Lambda表达式详解

    Java Lambda表达式详解 什么是Lambda表达式? Lambda表达式是JDK8引入的一种新的语言特性,主要用于简化Java中的匿名内部类的使用。Lambda表达式本质上是一种匿名函数,实现了函数式编程的思想。 Lambda表达式的语法 Lambda表达式的基本语法如下: (parameters) -> expression 或 (param…

    Java 2023年5月20日
    00
  • Java遍历起止日期中间的所有日期操作

    下面是Java遍历起止日期中间的所有日期的完整攻略: 前置条件 在使用Java进行日期遍历之前,首先需要使用Java提供的LocalDate类来表示起止日期。 LocalDate startDate = LocalDate.of(2021, 5, 1); LocalDate endDate = LocalDate.of(2021, 5, 10); 上面的代码…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部