下面是详细讲解 “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技术站