iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysqlenum字段类型的谨慎使用
  • 368
分享到

mysqlenum字段类型的谨慎使用

2024-04-02 19:04:59 368人浏览 独家记忆
摘要

目录为什么使用枚举枚举类型使用陷阱使用例子:插入数字例子:为什么使用枚举 限定值的取值范围,比如性别(男,女,未知)等。 枚举类型使用陷阱 1.超级不推荐在Mysql中设置某一字段类

为什么使用枚举

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

枚举类型使用陷阱

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;

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

public interface Test5NumRepository extends JpaRepository<Test5Num, Long>{
 
}
@Autowired
    private Test5NumRepository t5N;
       
    @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字段类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: mysqlenum字段类型的谨慎使用

本文链接: https://www.lsjlt.com/news/164208.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysqlenum字段类型的谨慎使用
    目录为什么使用枚举枚举类型使用陷阱使用例子:插入数字例子:为什么使用枚举 限定值的取值范围,比如性别(男,女,未知)等。 枚举类型使用陷阱 1.超级不推荐在mysql中设置某一字段类...
    99+
    2022-11-13
  • mysql enum字段类型的谨慎使用
    目录为什么使用枚举枚举类型使用陷阱使用例子:插入数字例子:为什么使用枚举 限定值的取值范围,比如性别(男,女,未知)等。 枚举类型使用陷阱 1.超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如&...
    99+
    2022-07-14
    mysqlenum字段类型 mysqlenum
  • Mysql中如何使用date类型字段
    这期内容当中小编将会给大家带来有关Mysql中如何使用date类型字段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 字符串转日期: 应该...
    99+
    2022-10-18
  • jpa使用@Column来定义字段类型
    目录jpa @Column定义字段类型jpa使用注解 设定字段类型为TEXT类型jpa @Column定义字段类型 columnDefinition 实在是比较万能,不好定义或者没有...
    99+
    2022-11-12
  • 使用JPA插入枚举类型字段
    目录JPA插入枚举类型字段1. 插入枚举名称的值,即字符串2. 插入枚举的序号,即ordinal3.插入枚举中的自定义值JPA枚举类型处理JPA插入枚举类型字段 JPA插入枚举类型字...
    99+
    2022-11-13
  • access常用的字段类型有哪些
    在数据库中,常用的字段类型有:1. 整数类型(Integer):用于存储整数值,如int、bigint、tinyint等。2. 字符...
    99+
    2023-09-28
    access
  • MySQL之JSON类型字段的使用技巧分享
    目录准备工作jsON对象基础操作JSON数组操作更多操作JSON字段在Java中的实践测试环境: mysql8.0.19 准备工作 CREATE TABLE json_demo ( `id` INT ( 11 ) N...
    99+
    2022-08-25
  • 怎么使用java反射获取字段类型
    要使用Java反射获取字段类型,可以按照以下步骤进行:1. 获取对应类的Class对象,可以通过`Class.forName()`方...
    99+
    2023-10-10
    java
  • jpa如何使用@Column来定义字段类型
    这篇文章将为大家详细讲解有关jpa如何使用@Column来定义字段类型,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jpa @Column定义字段类型columnDefinition 实在是比较万能,不好...
    99+
    2023-06-21
  • 使用mybatisplus接收mysql字段为json类型的数据
    一.数据库设计 CREATE TABLE `inv_learning_examination_questions` ( `id` bigint(20) NOT NULL, `title` varchar(255) CHARA...
    99+
    2023-08-31
    sql 数据库
  • JSON字段类型在ORM中的使用是怎么样的
    JSON字段类型在ORM中的使用是怎么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JSON字段类型在ORM中的使用  ThinkPHP5.1版本正式发布已...
    99+
    2023-06-02
  • 如何使用mysql数据类型和字段属性
    这篇文章主要为大家展示了如何使用mysql数据类型和字段属性,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。数据类型:mysql的数据类型就是存储数据的类型。数...
    99+
    2022-10-18
  • Oracle中如何使用CLOB大数据字段类型
    这篇文章将为大家详细讲解有关Oracle中如何使用CLOB大数据字段类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Oracle中的varchar2类...
    99+
    2022-10-18
  • MySQL中BLOB字段类型的作用是什么
    MySQL中BLOB字段类型的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。BLOB类型的字段用于存储二进制数据MySQL中,BLO...
    99+
    2022-10-18
  • Postgresql数据库中的json类型字段使用示例详解
    目录1. json概述2. PostgreSQL数据库中使用Json类型字段2.1. 创建表定义字段信息2.2. 增加2.3. 查询键值2.3.1. 查询键2.3.2. 查询值2.3.3. where查询条件使...
    99+
    2023-02-09
    Postgresqljson类型字段使用 Postgresqljson字段
  • mysql中json类型字段的基本用法实例
    目录前言基本环境jsON类型字段常用操作插入JSON类型数据查询JSON类型数据更新JSON类型数据中的特定字段匹配JSON类型数据中的特定字段结语前言 mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以...
    99+
    2022-08-12
    mysql的json类型 mysql处理json mysql有解析json数据
  • mysql5.7 新增的json字段类型用法实例分析
    本文实例讲述了mysql5.7 新增的json字段类型用法。分享给大家供大家参考,具体如下: 一、我们先创建一个表,准备点数据 CREATE TABLE `json_test` ( `id` int(...
    99+
    2022-10-18
  • C#类的成员之Field字段的使用
     字段是在类中声明的成员变量,用来储存描述类特征的值,字段可以被该类中声明的成员函数访问,根据字段的访问控制,也可以在其他类中通过该类或该类的实例进行访问.字段可以是任意变...
    99+
    2022-11-13
  • 怎么使用SAP CRM AET工具创建类型为下拉列表的扩展字段
    本篇文章为大家展示了怎么使用SAP CRM AET工具创建类型为下拉列表的扩展字段,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。通过应用程序扩展工具创建扩展字段时,此工具似乎不支持代码列表(或下拉列...
    99+
    2023-06-04
  • MySQL数据类型中数字类型的正确使用是怎样的
    MySQL数据类型中数字类型的正确使用是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  无论是在小得可怜的免费空间或是...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作