一文掌握Mysql中的Enum数据类型

ENUM类型简单来说就是在创建表时指定多个常量值。
例如,性别只能是“男”或“女”。
存储时,MySQL将这些值替换为数字,例如“男”为1 ,“女”为2 这样可以节省空间,但要小心。

输入数据时,可以直接写入值(如“male”)或索引(如1 ),但输入“0”将被转换为空字符串,输入不存在的值将导致错误。

更改计数器的定义(例如减小其值)时,必须确保没有其他数据使用该值。
添加值时,在前面添加会破坏顺序,但在末尾添加则不会。

使用ENUM时要小心,不要放数字,很容易混淆。
例如,0是索引,而不是数字0。
使用INT或VARCHAR更安全。

在Java中使用ENUM时,默认使用数字,这可能是一个错误。
使用@Enumerated(EnumType.STRING) 来存储字符串。

简而言之,ENUM 非常适合固定字符串集合。
如果使用得好,可以节省空间,但如果使用不当,则会带来更多的问题。
记住不要删除已使用的值,增值的值优先。
使用 INT 或 VARCHAR 作为数值或变量值。

mysql中enum是什么意思

嘿,ENUM 真的很有趣。
上周有客户问我MySQL里是什么样的...你得准确地告诉他:
ENUM主要是用来控制某个字段,这样只能填写几个固定的选项。
比如你有一个status字段,它只能有‘待付款’、‘已发货’、‘已完成’这些值,不能随便改。
这在电子商务系统中特别有用,可以防止用户填写随机信息。

它实际上是在内部存储数字的。
“待付款”可能是 1 ,“发货”是 2 ,“已完成”是 3 ...这使得检查速度更快。
如果你想一想,直接比较数字肯定比比较字符串要快。
我自己遇到的坑是,如果某个列中混入了MySQL未定义的值,比如插入‘cancelled’,默认会变成NULL(取决于是否设置了严格模式)。
这很烦人。
数据会突然变空,导致故障排除变得困难。

存储方面也有优势。
由于它是以数字形式存储的,因此占用的空间很小。
我之前使用ENUM在表中存储性别(男/女/未知),结果比使用VARCHAR轻了几兆字节,这对于大表来说是节省了。

但是,ENUM也有明显的缺点。
一旦你想改变枚举中的值,比如添加“cancelled”,你就必须使用ALTER TABLE来重建整个表。
2 02 3 年我在上海某商场做的一个项目中,有一个表使用了2 00万条数据的ENUM字段。
整整花了3 个小时才换完,桌子也锁了一整天。
如果这是一个大型在线表,它会让 DBA 发疯。

另一个陷阱是 ENUM 默认按照您定义的顺序排序。
例如“Completed”排在“Shipped”之后,那么查询时“Completed”就会排在后面。
如果你觉得字母顺序更合理,就得用ORDER BY...COLLATE...来做特殊处理,非常麻烦。

现在MySQL 8 .0+有更好的解决方案,例如使用CHECK约束或外键来关联状态表。
但ENUM在值固定、不需要经常改变的简单场景下还是很有用的。
例如,如果保存订单状态和用户级别,就完全足够了。

无论如何,这取决于你。
如果你的表数据不大,并且确定值不会改变,ENUM 就不错。
如果数据量很大,或者可能随时添加或删除值,最好考虑其他更可靠的方法。