mysql enum字段类型的谨慎使用

目录
  • 为什么使用枚举
  • 枚举类型使用陷阱
  • 使用例子:
  • 插入数字例子:

为什么使用枚举

限定值的取值范围,比如性别(男,女,未知)等。

枚举类型使用陷阱

1.超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;

  • 解释1:你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错
  • 解释2:enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错;如果你使用‘0’这个值去取枚举值,并做插入操作,你会发现它竟然会成功,但是插入的结果是一个“空”(不是null)
  • 解释3:enum类型对于php等弱语言类型的支持很差,弱语言类型打引号和不打引号的值可能是同一类型,但是对于mysql中enum类型的字段来说,那就不一定是一回事了

结论:总之,不要拿mysql的enum类型取存一些数字;如果你一定要使用这个字段去存数字,请把这个字段定义为int,然后在java代码中使用枚举类做一个对于这个字段值范围的一个限定!(后面有代码)

2.你可能会报这个错——Caused by: java.sql.SQLException: Data truncated for column 'Color' at row 1  ;

  • 原因:Jpa默认使用整数顺序值持久化枚举类型;
  • Mysql中枚举类型Color定义取值的顺序是RED、GREEN、BLUE,因此,当这三个取值持久化到数据库表时,取值分别是0、1、2;
  • 意思就是我们这里存往数据库的数据是0、1、2这样的数字,而不是RED、GREEN、BLUE字符串, 但是Mysql数据库中定义的是RED、GREEN、BLUE,并没有其它值所以报错

解决:在entity中使用@Enumerated(EnumType.STRING)标注你的枚举类型属性,如果标注,默认是integer

使用例子:

建表语句为

 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);
    }

结果为:

插入数字例子:

建表

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>{

}
@Autowired
    private 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 enum字段类型的谨慎使用的文章就介绍到这了,更多相关mysql enum字段类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql之set与enum的介绍

    set,enum的数据类型都是字符串类型的对象,其中set最多可以包含64个元素,并且可以任意取到集合中的元素.而enum则是只能取到集合中的木一个元素,最多包含65536个元素,也就是说set是多项选择,enum是单项选择了.这里我们来比较下他们之间相同点和不同点: 复制代码 代码如下: mysql> create table db_set(    -> set1 set('x','y','z') not null,    -> enum1 enum('one','two','thre

  • 要慎用mysql的enum字段的原因

    PHP低级编程的兄弟是这样来看这个问题的,我作下笔录如下,期望能客观的理解这个enum字段的优点及缺点: 膘哥观点:     enum有优点.但个人觉得...缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好.缺点是..enum不适合PHP.主要是PHP是弱类型,如:你insert into ..... set a= 1,你没法知道你是想 a= '1' 还是 a= 1(a='1'是插入值1,a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加

  • MySQL数据类型enum 枚举类型

    例如: 性别 gender 男 女 保密 基本语法: enum(数据值 1,数据值 2...); 数据值列表在 255 个以内,使用 1 个字节来存储 数据值列表超过 255,但是小于 65535,使用 2 个字节来存储 -- Enum(0=>'男', 1=>'女', 2=>'保密') create table my_enum( gender enum('男', '女', '保密') ) mysql> desc my_enum; +--------+----------------

  • 实例测试MySQL的enum类型

    在开发项目时通常会遇到一些状态字段,例如订单的状态有 待支付.已支付.已关闭.已退款 等,我以前做的项目都是把这些状态用数字存在数据库中,然后在 php 代码中用常量来维护一份映射表,例如: const STATUS_PENDING = 0; const STATUS_PAID = 1; const STATUS_CLOSED = 2; const STATUS_REFUNDED = 3; 但是在实际使用过程中发现并不是那么好用,由于各种原因(追查 bug.临时的统计需求等)我们常常需要登录到

  • mysql enum字段类型的谨慎使用

    目录 为什么使用枚举 枚举类型使用陷阱 使用例子: 插入数字例子: 为什么使用枚举 限定值的取值范围,比如性别(男,女,未知)等. 枚举类型使用陷阱 1.超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’: 解释1:你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错 解释2:enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错:如果你使用‘0’这个值去取枚举

  • mysql查询字段类型为json时的两种查询方式

    表结构如下: id varchar(32) info json 数据: id = 1 info = {"age": "18","disname":"小明"} -------------------------------------------- 现在我需要获取info中disanme的值,查询方法有: 1. select t.id,JSON_EXTRACT(t.info,'$.disname') as disname fro

  • MySQL中字段类型为longtext的值导出后显示二进制串方式

    目录 MySQL字段类型为longtext的值导出后显示二进制串 使用MySQL的CAST()函数或者CONVERT()函数 MySQL的基本语句及用法 WHERE子句:条件查找 UPDATE子句:数据更新 DELETE子句:删除数据 LINK子句:元字符查找 UNION操作符:联合查询结果 MySQL字段类型为longtext的值导出后显示二进制串 MySQL中字段类型为 longtext 的字段值保存的是Blob (Binary large objects),所以在导出sql或者将sql查询

  • Mysql修改字段类型、长度及添加删除列实例代码

    目录 1.mysql中修改字段长度: 2.mysql修改字段类型: 3.mysql中增加列: 4.mysql中修改列: 5.mysql中删除列 6.mysql 修改字段长度更多实例 总结 1.mysql中修改字段长度: ALTER TABLE tb_article MODIFY COLUMN NAME VARCHAR(50); 这里的tb_article为表名,NAME为字段名,50为修改后的长度 2.mysql修改字段类型: ALTER TABLE tb_article MODIFY COLU

  • MySQL中字段类型char、varchar和text的区别

    在MySQL中,char.varchar和text类型的字段都可以用来存储字符类型的数据,char.varchar都可以指定最大的字符长度,但text不可以. 它们的存储方式和数据的检索方式也都不一样. 数据的检索效率是:char > varchar > text 具体说明: char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时

  • 简单了解mysql存储字段类型查询效率

    检索性能从快到慢的是(此处是听人说的): 第一:tinyint,smallint,mediumint,int,bigint 第二:char,varchar 第三:NULL 解释(转载): 整数类型 1.TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别用8,16,24,32,64存 2.整数都有UNSIGNED可选属性 (拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 - 127. 那么如果我们在明确不需要

  • 详解MySQL中数据类型和字段类型

    目录 1. mysql的数据类型 (1)数值型 (2)字符(串)型 (3)日期和时间型 (4)null值 2. mysql的列(字段)类型 2.1数值列类型 2.2字符串列类型 2.3日期时间列类型 1. mysql的数据类型 在mysql中有如下几种数据类型: (1)数值型 数值是诸如32 或153.4 这样的值.mysql 支持科学表示法,科学表示法由整数或浮点数后跟“e”或“e”.一个符号(“+”或“-”)和一个整数指数来表示.1.24e+12 和23.47e-1 都是合法的科学表示法表示

  • Mysql修改字段名和修改字段类型的实例代码

    1.修改字段类型.字段名.字段注释.类型长度.字段默认值 mysql修改字段类型: --能修改字段类型.类型长度.默认值.注释 --对某字段进行修改 ALTER TABLE 表名 MODIFY [COLUMN] 字段名 新数据类型 新类型长度 新默认值 新注释; -- COLUMN关键字可以省略不写 alter table table1 modify column column1 decimal(10,1) DEFAULT NULL COMMENT '注释'; -- 正常,能修改字段类型.类型长

  • MySQL如何修改字段类型和字段长度

    目录 mysql修改字段类型和字段长度 1.修改字段类型 2.修改字段长度 修改数据库表的某一字段长度 mysql修改字段类型和字段长度 1.修改字段类型 格式:alter table 表名 modify column 字段名 类型; 实例: 将users表的registerTime字段改为datetime类型; alter table users modify column registerTime datetime; 2.修改字段长度 格式:alter table 表名 modify col

随机推荐