本篇文章给大家带来了关于mysql的相关知识,其中主要整理了Enum数据类型的相关问题,Mysql中的enum类型就是我们常说的枚举类型,它的取值范围需要在创建表时通过枚举方式(一个个的列出来)显式指定,下面一起来看一下 ...
本篇文章给大家带来了关于mysql的相关知识,其中主要整理了Enum数据类型的相关问题,Mysql中的enum类型就是我们常说的枚举类型,它的取值范围需要在创建表时通过枚举方式(一个个的列出来)显式指定,下面一起来看一下,希望对大家有帮助。 推荐学习:mysql视频教程 Mysql中的enum类型就是我们常说的枚举类型,它的取值范围需要在创建表时通过枚举方式(一个个的列出来)显式指定。对1至255个成员的枚举需要1个字节存储;对于255至65535个成员,需要2个字节存储。最多允许有65535个成员。 enum底层存的是十进制整数,严格按顺序1,2,3,4,5…排列,固千万不要用enum来存数字。 有时候可以使用枚举代替常用的字符串类型,枚举列可以把一些不重复的字符串存储成一个预定义的集合,MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到1个或2个字节中。MySQL在内部会将每个值在列表中的位置保存为整数,并且在 特性验证新建表CREATE TABLE `mytest` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sex` enum('男','女') DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4; 插入数据insert into mytest(sex) values('男'); // sex = 男 insert into mytest(sex) values('女'); // sex = 女 insert into mytest(sex) values(1); // sex = 男 insert into mytest(sex) values('1'); // sex = 男 insert into mytest(sex) values('未知'); // 插入报错,1265 - Data truncated for column 'sex' insert into mytest(sex) values('0'); // sex = '' insert into mytest(sex) values(0); // 插入报错,1265 - Data truncated for column 'sex' 从上可以看出字段中的enum值在mysql中的数据结构中类似于一个数组,并且下标是从1开始计算的,总结出: 1、通过正确的枚举值可以插入到数据库,如:第1、2条语句; 2、通过正确的下标可以插入到数据库,如:第3、4条语句; 3、插入 4、插入 查询数据查询时,通过 “列名+0” 即可获取改值在枚举中的位置关系,如下SQL语句执行结果 SELECT id,sex,sex+0 from `mytest` ; 查询结果如下: 修改枚举减少枚举类型使用 修改枚举名称和减少枚举类型情况一样,必须确保枚举值没有被记录行使用 首部插入枚举使用 如下图,插入之前的结果: 如下图,插入之后的结果: 中间掺入枚举使用 如下图,插入之前的结果: 如下图,插入之后的结果: 尾部插入枚举(推荐)使用 枚举类型使用陷阱1、超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;
总之,不要拿mysql的enum类型取存一些数字;如果你一定要使用这个字段去存数字,请把这个字段定义为int,然后在java代码中使用枚举类做一个对于这个字段值范围的一个限定!(后面有代码) 2、可能会出现 原因:
解决:在entity中使用 枚举使用例子在JPA中使用 建表语句 CREATE TABLE test4 ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, brand VARCHAR(255) NOT NULL, color ENUM('RED','GREEN','BLUE') ) ENGINE = InnoDB; Java代码中,枚举类 public enum Color { RED, GREEN, BLUE } Java代码中,Javabean @Entity @Table(name="test4") public class ClothesRight { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated(EnumType.STRING) private Color color; private String brand; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public ClothesRight(Long id, Color color, String brand) { super(); this.id = id; this.color = color; this.brand = brand; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public ClothesRight() { super(); } } 简单使用 public interface Test4RightRepository extends JpaRepository<ClothesRight, Long>{ } @Autowired private Test4RightRepository t4R;/** * 使用@Enumrated()标注字段为枚举的数据 * 结果 正确插入RED */ @GetMapping(value="/addclothesright") public void GetTest4Right(){ List<ClothesRight> entities = new ArrayList<>(); ClothesRight clothes = new ClothesRight(); //clothes.setId(1L); clothes.setBrand("佐丹奴"); clothes.setColor(Color.RED); entities.add(clothes); t4R.save(entities); } 结果为: 插入数字例子(不推荐)mysql枚举的字段类型不宜插入数字,但是需求就是要用数字,怎么办? 解决:mysql数据类型定义为int,枚举限定在java代码中解决 建表语句 CREATE TABLE test5num ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, used int(11) DEFAULT NULL COMMENT '0:没用过 1:已用过 2:不能用' )ENGINE = InnoDB; Java代码 @Entity@Table(name="test5num")public class Test5Num { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private Used used; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Used getUsed() { return used; } public void setUsed(Used used) { this.used = used; } public Test5Num() { super(); } public Test5Num(Long id, Used used) { super(); this.id = id; this.used = used; } } /** *枚举类 */public enum Used { UNUSED(0,"没用过"), USED(1,"已用过"), FORBIDDEN(2,"不能用"); private Integer code; private String discribe; public Integer getCode() { return code; } public String getDiscribe() { return discribe; } private Used(Integer code, String discribe) { this.code = code; this.discribe = discribe; }} /** * dao层 */public interface Test5NumRepository extends JpaRepository<Test5Num, Long>{ } @Autowiredprivate Test5NumRepository t5N; /** * mysql枚举的字段类型不宜插入数字,但是需求就是要用数字,怎么办? * 解决:mysql数据类型定义为int,枚举限定在java代码中解决 * */@GetMapping("/test5insert")public void insertT5(){ Test5Num t5 = new Test5Num(); t5.setUsed(Used.USED); List<Test5Num> list = new ArrayList<Test5Num>(); list.add(t5); t5N.save(list);} 小结
推荐学习:mysql视频教程 以上就是一文掌握Mysql中的Enum数据类型的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |