首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql集合或枚举类型

基础概念

MySQL中的集合(SET)和枚举(ENUM)类型都是用于存储预定义值的数据类型。它们都可以用于限制字段只能取一组预定义的值。

  • ENUM:枚举类型允许你定义一个字段,该字段只能取一组预定义值中的一个。这些值是按顺序排列的,每个值都有一个索引编号,从1开始。枚举类型在内部是以整数形式存储的。
  • SET:集合类型允许你定义一个字段,该字段可以取一组预定义值中的任意多个(但不是全部)。与ENUM不同,SET类型中的每个值都是独立的,并且没有顺序。集合类型在内部也是以整数形式存储的,但使用位来表示每个值的存在与否。

优势

  • 数据完整性:通过限制字段只能取预定义的值,可以确保数据的完整性和一致性。
  • 节省空间:由于这些类型在内部以整数形式存储,因此相比于存储实际字符串,它们可以节省存储空间。
  • 提高查询效率:预定义的值使得数据库可以更快地处理查询和索引。

类型

  • ENUM:只能取一个值,且该值必须在预定义的列表中。
  • SET:可以取多个值,但每个值都必须是预定义列表中的一个。

应用场景

  • ENUM:适用于那些只有有限个选项,且每个记录只能选择其中一个的场景,例如性别(男/女)、订单状态(待支付/已支付/已发货/已完成)等。
  • SET:适用于那些有多个可选值,且每个记录可以选择多个值的场景,例如用户的兴趣爱好(篮球/足球/游泳/阅读)等。

可能遇到的问题及解决方法

问题1:插入非法值

原因:尝试向ENUM或SET字段插入不在预定义列表中的值。

解决方法

  1. 在插入数据之前进行验证,确保插入的值在允许的范围内。
  2. 使用触发器或存储过程来检查并阻止非法插入。

问题2:性能问题

原因:当ENUM或SET类型的字段包含大量值时,可能会导致性能下降。

解决方法

  1. 尽量减少ENUM或SET类型中值的数量。
  2. 如果可能的话,考虑使用其他数据类型(如VARCHAR)并自行进行数据验证。
  3. 优化查询,避免在ENUM或SET字段上进行复杂的操作。

问题3:可扩展性问题

原因:随着业务的发展,可能需要向ENUM或SET类型中添加新的值。

解决方法

  1. 在设计数据库时预留一些额外的值,以便将来扩展。
  2. 如果需要频繁添加新值,考虑使用其他数据类型(如VARCHAR)并自行管理值的列表。

示例代码

以下是一个创建包含ENUM和SET类型字段的表的示例:

代码语言:txt
复制
CREATE TABLE `user_info` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `gender` ENUM('male', 'female') NOT NULL,
  `interests` SET('basketball', 'football', 'swimming', 'reading') NOT NULL
);

在这个示例中,gender字段是一个ENUM类型,只能取'male'或'female';interests字段是一个SET类型,可以取'basketball'、'football'、'swimming'或'reading'中的任意多个值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL 枚举类型的“八宗罪”

/ MySQL枚举(ENUM)类型是程序员群体中的一个讨论热点。...这也许看起来十分“学院派”“迂腐陈旧”,但这正是以下各种“罪行”的源头。 2. 更改ENUM类型字段,代价很昂贵 永恒不变的是, 每次你创建ENUM类型字段的时候都说:“这个字段不可能变的”。...如果你使用关系表去替代ENUM类型字段,改变枚举集合只不过是使用INSERT、UPDATE和DELETE,对比来看真是滑稽。...很重要的一点,当更改ENUM类型字段的枚举集合时,MySQL会转换任意已有但不存在于新的枚举集合中的记录值为''(空的字符串)。使用关系表,在更改和删除枚举集合时会灵活很多(下面会提到)。 3....MySQL 会将我们地数值型数据当作是枚举索引去处理(并没有错,但会令人混淆),根据索引可知,ENUM字段的第一个值为 0 。(译:枚举索引由 1 开始) 8.

4.4K52

JPA不识别MySQL枚举类型

1 枚举好用吗?...数据字典型字段,枚举比Integer好: 限定值,只能赋值枚举的那几个实例,不能像Integer随便输,保存和查询的时候特别有用 含义明确,使用时不需要去查数据字典 显示值跟存储值直接映射,不需要手动转换...,比如1在页面上显示为启用,0显示禁用,枚举定义好可以直接显示 基于enum可以添加一些拓展方法 但默认 2 JPA不识别MySQL 的 enum 类型 会报错: Cannot determine value...缺点: 顺序性 java枚举的顺序从0开始递增,没法自己指定,我有些枚举并不是从0开始的,或者不是+1递增的,比如一些行业的标准代码。 旧数据可能不兼容 如-1代表删除,映射不了。...也有局限性: String类型,数据库定义int,即使override toString方法返回数字的String,JPA也保存不了 同样不适用旧数据,旧数据是int 不能改名,改了后数据库的记录映射不了

7100
  • 枚举类型

    枚举合起来的意思就是例举出有限的事物的集合!例如:例举一周有几天、一年有多少个月份。 枚举的正式解释:枚举类型是jdk5中新增的特性,它是一种加了限制的特殊的class类型。...这里的限制指的是对枚举类型所能创建的对象的个数进行了限制!他不像普通的class类那样可以创建无数的对象,他只能创建固定数目的对象,而且这些对象是在定义枚举类型的时候就已经在枚举类内部创建好了的!...EnumSet和EnumMap 4.1、EnumSet 此枚举集合类EnumSet实现了Set集合接口,是一个抽象类,他可以将一个枚举类转换成一个Set集合!...EnumMap实现了Map集合接口,他可以将一个枚举类转换成一个Map集合!...其中键是枚举常量,值是字符串类型 具体转换操作如下所示!

    82910

    TypeScript 枚举类型

    使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。...利用这个特性,在确保不出现冲突的提前下,我们还可以合并在不同文件中定义的相同名称的枚举分开定义枚举。...当一个表达式满足下面条件之一时,它就是一个常量枚举表达式: 一个枚举表达式字面量(主要是字符串字面量数字字面量); 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的); 带括号的常量枚举表达式...若常量枚举表达式求值后为 NaN Infinity,则会在编译阶段报错。...字符串枚举的概念很简单,在一个字符串枚举里,每个成员都必须用字符串字面量,另外一个字符串枚举成员进行初始化。

    1.5K10

    MySQL精选 | 枚举类型ENUM的DDL变更测试

    导读 ---- 本文深入介绍枚举类型EUNM和集合类型SET。测试基于InnoDB存储引擎上,对MySQL数据库枚举类型ENUM的字段进行DDL变更操作,是否需要重新创建表呢?...log InnoDB存储引擎:plugin-InnoDB 1.1.8 (二) 测试数据准备 ---- 鉴于篇幅的缘由,单独作为一篇文章分享在www.mysqlops.com网站上,请点击MySQL数据库之数据类型集合类型枚举类型测试环境...数据库枚举类型字段没有显式创建索引信息时,即使符合MySQL数据库使用索引条件要求的SQL语句,也无索引信息可用,也即MySQL数据库枚举类型字段值域列表中的存储序列编号,无法做到替代索引的作用,也即依然需要显式创建数据库索引...MySQL数据库枚举类型字段与其他数据类型一样,进行DDL变更操作可能产生的影响; b....MySQL数据库枚举类型字段的DDL变更操作,属于枚举类型字段特有的内容: 枚举类型字段的枚举数据值域列表,以尾部追加枚举元素值的方式,不会出现锁表等; 枚举类型字段的枚举数据值域列表中,若是调整枚举类型枚举元素值的顺序

    3K30

    枚举类型浅析

    但是枚举类的构造器有很大不同:首先,构造器只是在构造枚举值时使用;其次,构造器是private的,不允许为public(这样可以保证外部代码无法新构造枚举类的实例。...3、所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。   (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。  ...(5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型枚举常量。  (6)  equals()方法: 比较两个枚举类对象的引用。...return x * y; case DIVIDE: return x / y; } throw new AssertionError("Unkonwn op:" + this); } } 枚举类型是编译安全类型...枚举构造器不可以访问枚举的静态域,除了编译时常量域除外。

    83130

    枚举类型enum用法(enum类型)

    可以用枚举类来表示: public enum SeasonEnum{ SPRING,SUMMER,FALL,WINTER; } 枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个多个接口...枚举类的实例以逗号分隔,分号结束,这些列出的枚举值代表了该枚举类的所有可能的实例。...【4】枚举类的方法和用法 (1)JDK 1.5中switch对枚举的扩展 switch( )的控制表达式(即括号中的条件)可以是任何枚举类型;当switch控制表达式使用枚举类型时...,同一个枚举实例只能与相同类型枚举实例进行比较。...、方法和构造器 前面说过,枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个多个接口,也可以有自己的构造器。

    3K20

    TypeScript-枚举类型

    前言 介绍其基本概念、语法特性以及如何开始使用它来构建类型安全的JavaScript应用程序。无论您是新手还是有经验的开发者,都能在这篇文章中找到有关TypeScript的重要信息和实用技巧。...枚举类型是 TS 为 JS 扩展的一种类型,在原生的 JS 中是没有枚举类型的,枚举用于表示固定的几个取值 例如:一年只有四季、人的性别只能是男或者女 定义枚举 enum Gender { Male..., Female } 如上代码的含义为,定义了一个名称叫做 Gender 的枚举类型, 这个枚举类型的取值有两个, 分别是 Male 和 Female: enum Gender { Male...数值类型,所以赋值一个数值不会报错: enum Gender { Male, Female } let val: Gender; val = 0; console.log(val);...console.log(Gender.Male); console.log(Gender.Female); 图片 TS 中的枚举类型的取值, 默认是从上至下从 0 开始递增的: enum Gender

    19520

    Java枚举类型使用

    使用枚举类型,优点是加载速度依赖于应用服务器,缺点是修改比较麻烦,每次加类型都需要发布代码。...对于Java枚举类型的使用,我们可以总结为以下几个方面:整型值,字符串字段和字符串的相关描述,下面我们就讨论如何方便的在这几个类型中相关转换,对于所有的类型转换可以总结如下: int --> Enum...String -->Enum Enum-->String Enum-->描述 int -->描述 String -->描述 下面我们对于上面的7种描述来做出对应的转换方法,首先定义一个枚举类型...public enum EnumDemo { fail, success, unknow; } 为了能够保证相关的value和值能够保存下来,我们需要对枚举类型改成如下...自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828:点击加群 发我邮件 laofu_online@163.com

    2.2K20

    C语言(枚举类型

    C语言中的枚举类型常年跑龙套当配角,不受待见,这当然是有其个人原因的。今天来个小知识,看看枚举为什么那么衰,也顺便看看怎么用。 我们先来回忆一下为什么需要枚举枚举究竟是个什么东东?...话说在很久很久以前,我们的祖先在编程的时候,发现只要整型就够了,于是发明了很多像int、short、long等的数据类型。...indigo, purple}; enum spectrum color; 注意到上面两行代码,第一行是所谓的枚举类型定义及其常量列表,实际上就定义了枚举变量的有效范围,从red(即1)开始,到purple...(即7),超过此范围的,对于枚举类型 enum spectrum 而言都是非法的,因此变量 color 的取值只能是red 到 purple。...= red + orange; // 错误,枚举不能相加减 从以上几行代码看出来,枚举类型是为了达到两个目的:第一,限定有效范围。

    1.8K30

    Python的枚举类型

    产生: 数据类型 dict,list,tuple,set 等等有时并不适用 使用: 引入模块:form enum import Enum 示例: 所有的枚举类型都是Enum类的子类,Py中没有enum这个数据类型...= 3 RED = 4 上述常量只要赋值为不同量即可,可以为不同的数字不同的字符串 print(EMP.BLACK) 注意: 这里运行会报错:ImportError: cannot...枚举的要求: 类型一般不能随意更改 类型一般不能出现重复 对于枚举类型: from enum import Enum class EMP(Enum):...: Attempted to reuse key: 'BLACK' 综上: 枚举类型可以保证类型名称的不重复性、并且保护类型不被修改 注意: 区别于枚举名称的重复(不允许): class...in EMP1: print(x) 输出: EMP1.BLACK EMP1.RED 上述将EMP1类中的全部枚举类型都打印出来 枚举类型的比较: 限定:同一枚举类中的枚举类型

    1.6K30

    C++枚举类型

    C++枚举类型 在C++中,如果一个变量只有几种可能的值,可以定义为枚举类型枚举是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。  C++声明枚举类型用enum开头。...花括号中Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday称为枚举元素枚举常量,表示这个类型的变量的值只能是以上7个值之一,它们是用户自己定义的标识符...C++声明枚举类型的一般形式为 enum 枚举类型名 {枚举常量表列}; C++在声明了枚举类型之后,可以用声明的枚举来定义变量。...weekday workday,week_end; workday和week_end被定义为枚举类型weekday的变量。 ...C++可以在声明枚举类型时另行指定枚举元素的值。 C++枚举值可以用来做判断比较。 C++中一个整数不能直接赋给一个枚举变量。 10.1 C++枚举类型 更多案例可以go公众号:C语言入门到精通

    1K128

    Java的枚举类型

    例如:性别:Man(男)、Woman(女)订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Checked(已确认收货)定义枚举类型public enum UserType...,可以在枚举类型中添加一些构造器、方法和域。...当然,构造器只是在构造枚举常量的时候被调用。所有的枚举类型都是 Enum 类的子类。它们继承了这个类的许多方法。其中最有用的一个是 toString() 方法,这个方法能够返回枚举常量名。...每个枚举类型都有一个静态的 values() 方法,它将返回一个包含全部枚举值的数组。ordinal 方法返回 enum 声明中枚举常量的位置,位置从 0 开始计数。...UserType common = UserType.valueOf("common"); // 返回具有指定名称的指定枚举类型枚举常量 UserType common1 = Enum.valueOf

    79450

    C语言——枚举类型

    一,什么是枚举类型 简单来说,枚举类型就是可以让我们给整数值分配有意义的名字,从而使得代码更易读、易维护 二,枚举类型的定义和变量的声明 1,如何定义和声明 枚举类型的定义和变量的声明方式也与结构体和联合体相似...(一)枚举类型的定义 enum 枚举名 { 成员项表列 }; (二)枚举变量的声明 enum 枚举名 变量名 举例:我们定义一个代表颜色的枚举类型,然后创建一个枚举变量a enum color...3,命名注意事项 同一个程序中不能定义同名的枚举类型;不同的枚举类型中,也不能存在同名的枚举成员。...⭐C语言中的枚举变量通常只能被赋值为枚举类型中定义的成员。...,再赋值 如果我们非要给枚举类型的变量赋整数值,则对枚举型的变量赋整数值时,需要进行类型转换 #include enum color { red = 1, yellow = 2,

    55411

    mysql中的enum是什么类型_数据库枚举类型是什么

    枚举类型使用陷阱 超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’; 解释1:你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错...“空”(不是null) 解释3:enum类型对于php等弱语言类型的支持很差,弱语言类型打引号和不打引号的值可能是同一类型,但是对于mysql中enum类型的字段来说,那就不一定是一回事了 结论:总之,...不要拿mysql的enum类型取存一些数字;如果你一定要使用这个字段去存数字,请把这个字段定义为int,然后在java代码中使用枚举类做一个对于这个字段值范围的一个限定!...; * Mysql枚举类型Color定义取值的顺序是RED、GREEN、BLUE,因此,当这三个取值持久化到数据库表时,取值分别是0、1、2; * 意思就是我们这里存往数据库的数据是...* 解决:mysql数据类型定义为int,枚举限定在java代码中解决 * */ @GetMapping("/test5insert") public void insertT5(){ Test5Num

    4.3K20
    领券