还在 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>{}
@Autowiredprivate 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);
}

结果:

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考135-上午题-【软件工程】-软件配置管理

备注&#xff1a; 该部分考题内容在教材中找不到。直接背题目 一、配置数据库 配置数据库可以分为以下三类&#xff1a; (1) 开发库 专供开发人员使用&#xff0c;其中的信息可能做频繁修改&#xff0c;对其控制相当宽松 (2) 受控库 在生存期某一阶段工作结束时发布的阶段产…

【算法】深度优先遍历(DFS)算法详解与实现

文章目录 1.算法原理2. 常见的深度优先遍历方式3. 代码实现总结 深度优先遍历&#xff08;DFS&#xff09;是一种常用的树或图的遍历算法&#xff0c;它通过尽可能深地搜索树或图的分支&#xff0c;直到路径上的所有节点都被访问完毕&#xff0c;然后再回溯到上一层&#xff0c…

什么是云渲染?云渲染平台怎么使用?云渲染怎么收费?

什么是云渲染&#xff1f; 云渲染是一种利用云计算技术提供的云端服务&#xff0c;用户可以将本地任务递交到远程服务器上&#xff0c;由远程计算集群协调和完成渲染&#xff0c;并将结果返回本地&#xff0c;最后用户可以在本地下载渲染结果。 而实时云渲染则是云渲染的一种…

python入门之简洁安装VS保姆版安装(含虚拟环境)

11、保姆版安装 Anoconda安装&#xff08;python的一个发行版本&#xff09; 优点&#xff1a;集成了许多关于python科学计算的第三方库&#xff0c;保姆级别 下载&#xff1a;www.anaconda.com/download/ 版本默认64位&#xff0c;py37 √&#xff1a;add anaconda to my…

OCP Java17 SE Developers 复习题14

答案 C. Since the question asks about putting data into a structured object, the best class would be one that deserializes the data. Therefore, ObjectInputStream is the best choice, which is option C. ObjectWriter, BufferedStream, and ObjectReader are no…

可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?

在当今的信息化时代&#xff0c;数据已经成为了现代决策的核心。无论是企业战略规划、运营管理&#xff0c;还是个人生活决策&#xff0c;数据都扮演着至关重要的角色。随着数据分析技术和工具的不断进步&#xff0c;数据在决策中的作用将变得更加突出&#xff0c;对组织和个人…

代码随想录算法训练营第三十六天|435. 无重叠区间,763.划分字母区间,56. 合并区间

题目&#xff1a;435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi]。返回需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 题目链接/讲解链接&#xff1a; https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0…

密文字段模糊检索方案

代码地址: https://github.com/zuiyu-main/EncryptDemo https://mp.weixin.qq.com/s/cXOg1tiMtJz2eibDZmXHUQ 在个别特殊领域中&#xff0c;数据的安全问题是非常的重要的&#xff0c;所以需要数据库存储的数据是需要加密存储的。所以也就引申出来本文这个问题&#xff0c;加密…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

重磅!Meta 发布 Llama 3,前所未有的强大功能和多模态能力|TodayAI

Meta今日宣布推出其最新一代尖端开源大型语言模型Llama 3。该模型预计很快将在多个领先的云服务平台上线&#xff0c;包括AWS、Databricks、Google Cloud、Hugging Face、Kaggle、IBM WatsonX、Microsoft Azure、NVIDIA NIM和Snowflake。 Llama 3模型得到了AMD、AWS、Dell、In…

【深度学习】yolov5目标检测学习与调试

2024.4.15 -2024.4.16 完结 0.准备&&补充知识点 yolo检测算法可以实现目标检测、分割和分类任务。 项目仓库地址&#xff1a;https://github.com/ultralytics/yolov5 跟练视频&#xff1a;目标检测 YOLOv5 开源代码项目调试与讲解实战 lux下载视频神器&#xff1a;h…

2W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPK-SAR 系列介绍

TPK-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压…

idea新建一个springboot项目

本文分为几个部分&#xff0c; 首先是在idea中新建项目&#xff0c; 然后是配置 项目的目录&#xff08;新建controller、service、dao等&#xff09;&#xff0c; 然后是自定义的一些工具类&#xff08;比如启动后打印地址等&#xff09;。 1.、创建篇 新建项目&#xff0…

IO基础-传统I/O模型

关于IO数据流有两种形式&#xff0c;来源于网络和磁盘分别叫做网络IO、磁盘IO。 客户端通过TCP和UDP协议将数据流发往服务端&#xff0c;服务端接收数据这个过程称为网络IO。 服务端读取本地文件数据到服务中的过程称为磁盘IO。 基于 Linux 一切皆文件的理念&#xff0c;在内…

[大模型]Qwen-7B-Chat WebDemo

Qwen-7B-Chat WebDemo 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行demo…

AI大模型日报#0419:全球最强开源大模型 Llama 3 发布:15T 数据预训练,参数将超 4000 亿

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 刚刚&#xff0c;全球最强开源大模型 Llama 3 发布&#xff1a;使用 15T 数据预训练&#xff0c;最大模型参数将超 4000 亿 摘要…

【目标跟踪】ByteTrack详解与代码细节

文章目录 一、前言二、代码详解2.1、新起航迹2.2、预测2.3、匹配2.4、结果发布2.5、总结 三、流程图四、部署 一、前言 论文地址&#xff1a;https://arxiv.org/pdf/2110.06864.pdf git地址&#xff1a;https://github.com/ifzhang/ByteTrack ByteTrack 在是在 2021 年 10 月…

书生浦语训练营第2期-第4节笔记

一、为什么要微调&#xff1f; 1. 适应特定任务或领域&#xff1a;虽然预训练的模型通常具有广泛的知识和理解能力&#xff0c;但它们可能不完全适应特定任务的需求。通过在特定的数据集上微调模型&#xff0c;可以使模型更好地理解和处理与特定任务或领域相关的数据。 2. 提高…

【uniapp】微信小程序2024手机号快速验证及无感登录教程(内附代码)

组件&#xff1a;手机号快速验证组件 适用对象&#xff1a;企业/个体 费用&#xff1a;0.03元/次 目录 前言思路前端后端代码无感登录onload事件无感登录方法登录判断后端mini_login2 最后 前言 最近注册了公司&#xff0c;可以注册具有支付能力的小程序了&#xff0c;各种材料…

在Nuxt.js中添加PostCSS自动前缀器

在其他浏览器中&#xff0c;有些 CSS 属性需要带有前缀。如-webkit- | -o- | -ms- 等等 Autoprefixer 是一个 PostCSS 插件&#xff0c;可以将你的CSS代码渲染到浏览器中自动补充厂商前缀&#xff0c;因此你不用担心自己编写的CSS代码有浏览器兼容性问题。 如&#xff1a; .fl…