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

一文掌握Mysql中的Enum数据类型
最新回答
仲夏柠叶香

2021-11-23 22:37:06

MySQL中的ENUM数据类型详解

ENUM类型基础特性
ENUM是MySQL中的枚举类型,需在创建表时显式指定取值范围(如ENUM('男','女'))。其存储机制如下:

  • 存储空间:1-255个成员占1字节,256-65535个成员占2字节,最多支持65535个成员。
  • 底层存储:实际存储的是整数索引(从1开始),而非字符串本身。例如,ENUM('男','女')中“男”对应1,“女”对应2。
  • 数据紧凑性:MySQL会压缩存储枚举值,适合存储不重复的字符串集合(如状态、性别等)。

ENUM类型操作规则

  1. 插入数据

    允许通过枚举值字符串索引整数插入,如INSERT INTO mytest(sex) VALUES('男')或VALUES(1)均有效。

    插入'0'会转为空字符串,插入0或未定义的枚举值(如'未知')会报错(错误代码1265)。

  2. 查询数据

    使用列名+0可获取枚举值的索引位置,如SELECT sex, sex+0 FROM mytest。

  3. 修改枚举定义

    减少枚举值:需确保现有数据不包含被删除的值,否则报错(如ALTER TABLE mytest MODIFY COLUMN sex ENUM('男'))。

    插入枚举值

    首部插入:会改变后续值的索引(如ALTER TABLE ... ENUM('未知','男','女'))。

    中间插入:插入位置后的索引均后移(如ALTER TABLE ... ENUM('男','未知','女'))。

    尾部插入:不改变现有索引(推荐方式,如ALTER TABLE ... ENUM('男','女','未知'))。

ENUM类型使用陷阱

  1. 避免存储数字

    混淆风险:ENUM的索引从1开始,与数字0的交互易出错(如0报错,'0'转为空字符串)。

    替代方案:若需存储数字,建议用INT类型,并在Java代码中通过枚举类限定范围(如public enum Used { UNUSED(0), USED(1) })。

  2. JPA持久化问题

    默认行为:JPA默认用整数顺序持久化枚举(如RED=0, GREEN=1),若数据库定义与顺序不匹配会报错(如Data truncated for column 'Color')。

    解决方案:使用@Enumerated(EnumType.STRING)标注字段,强制存储字符串值(如color ENUM('RED','GREEN','BLUE')对应Java的Color.RED)。

最佳实践建议

  • 适用场景:适合存储固定集合的字符串(如订单状态、性别),利用其紧凑存储特性。
  • 维护规范:避免删除或修改已使用的枚举值,修改时优先在尾部添加新值。
  • 类型选择:若需存储数字或动态值,优先使用INT或VARCHAR类型,而非ENUM。

通过合理使用ENUM类型,可提升数据存储效率并减少冗余,但需严格遵循其操作规则以避免潜在问题。