问题描述:
IDEA中使用JPA向Mysql创建带有中文的枚举变量的表时,报枚举值重复错误。Column ‘***’ has duplicated value ‘?’ in ENUM。
@Override
@Entity
@Data
public class Article implements Serializable {
@Id
/**
* Description: 由数据库控制,auto是程序统一控制
*/
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false, unique = true)
@NotEmpty(message = "标题不能为空")
private String title;
/**
* Description: 枚举类型
*/
@Column(columnDefinition="enum('她','我','你')")
private String type;//类型
/**
* Description: Boolean类型默认false
*/
private Boolean available = Boolean.FALSE;
@Size(min=0, max=20)
private String keyword;
@Size(max = 255)
private String description;
@Column(nullable = false)
private String body;
/**
* Description: 创建虚拟字段
*/
@Transient
private List keywordlists;
public List getKeywordlists() {
return Arrays.asList(this.keyword.trim().split("|"));
}
public void setKeywordlists(List keywordlists) {
this.keywordlists = keywordlists;
}
}
IDEA报错:
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at com.example.demo.JpaEntityDemoApplication.main(JpaEntityDemoApplication.java:10) ~[classes/:na]
Caused by: java.sql.SQLException: Column 'type' has duplicated value '?' in ENUM
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.15.jar:8.0.15]
分析:
在nvicat中执行IDEA中相同创建表代码:
create table article1234 (
id bigint not null auto_increment,
available bit,
body varchar(255) not null,
description varchar(255),
keyword varchar(20),
title varchar(255) not null,
type ENUM('你','我','她'),
primary key (id)) engine=InnoDB
得到同样报错:
[SQL]create table article1234 (
id bigint not null auto_increment,
available bit,
body varchar(255) not null,
description varchar(255),
keyword varchar(20),
title varchar(255) not null,
type ENUM('你','我','她'),
primary key (id)) engine=InnoDB
[Err] 1291 - Column 'type' has duplicated value '?' in ENUM
所以不是IDEA和JPA的问题。将enum中的值换为了非中文值,进行测试,测试成功,表成功创建。
原因:
数据库编码问题,导致表中enum枚举值的中文显示为?,所以Mysql报"?"重复错误。
解决方案:
将数据库编码设置为utf-8。