2021-11-23 22:37:06
MySQL中的ENUM数据类型详解
ENUM类型基础特性
ENUM是MySQL中的枚举类型,需在创建表时显式指定取值范围(如ENUM('男','女'))。其存储机制如下:
ENUM类型操作规则
插入数据
允许通过枚举值字符串或索引整数插入,如INSERT INTO mytest(sex) VALUES('男')或VALUES(1)均有效。
插入'0'会转为空字符串,插入0或未定义的枚举值(如'未知')会报错(错误代码1265)。
查询数据
使用列名+0可获取枚举值的索引位置,如SELECT sex, sex+0 FROM mytest。
修改枚举定义
减少枚举值:需确保现有数据不包含被删除的值,否则报错(如ALTER TABLE mytest MODIFY COLUMN sex ENUM('男'))。
插入枚举值:
首部插入:会改变后续值的索引(如ALTER TABLE ... ENUM('未知','男','女'))。
中间插入:插入位置后的索引均后移(如ALTER TABLE ... ENUM('男','未知','女'))。
尾部插入:不改变现有索引(推荐方式,如ALTER TABLE ... ENUM('男','女','未知'))。
ENUM类型使用陷阱
避免存储数字
混淆风险:ENUM的索引从1开始,与数字0的交互易出错(如0报错,'0'转为空字符串)。
替代方案:若需存储数字,建议用INT类型,并在Java代码中通过枚举类限定范围(如public enum Used { UNUSED(0), USED(1) })。
JPA持久化问题
默认行为:JPA默认用整数顺序持久化枚举(如RED=0, GREEN=1),若数据库定义与顺序不匹配会报错(如Data truncated for column 'Color')。
解决方案:使用@Enumerated(EnumType.STRING)标注字段,强制存储字符串值(如color ENUM('RED','GREEN','BLUE')对应Java的Color.RED)。
最佳实践建议
通过合理使用ENUM类型,可提升数据存储效率并减少冗余,但需严格遵循其操作规则以避免潜在问题。