Enum类型

这个是从JDK 1.5开始有的,可以方便地代替静态常量。这样,你就可以写一个类,里面将各种枚举写进去,要用的时候总是有这么一个类就够了。要定义举个简单例子

public enum Season {

      SPRING, SUMMER, AUTUMN, WINTER;

}

Season是一个Enum类,这些元素都是Season类型的实例,之所以使用大写形式,是因为它们默认情况下都是public static final的,所以不用自己再去添加了。可以通过Season.SPRING这种方来获取枚举常量。

除此之外,还可以赋值,比如Season season = Season.WINTER; 这里需要注意的是,除了枚举常量和null之外,不能给枚举变量赋其它的值。

还需要注意的是,虽然说Season是继承自Enum类型的,但是,你不能使用extends Enum来做这件事情,必须使用enum关键字来声明这个是Enum的子类。

如果在定义的时候只是使用了这种最简单的定义的话,那么系统会自动为你分配从0开始的数值。
<think>我们正在处理关于MySQL中ENUM枚举类型的查询问题。根据用户提供的引用内容,我们可以总结出以下几点关键信息: 1. ENUM类型在创建时需要显式指定枚举值列表(引用[1][2])。 2. 插入数据时,如果插入的值不在枚举列表中,在严格模式下会报错(Data truncated),在非严格模式下会插入空字符串(引用[1][4])。 3. ENUM类型在存储时实际上是以整数索引的形式存储的(引用[2][3])。 4. 查询时,ENUM类型不区分大小写(引用[2])。 5. 使用整数索引查询时,只能使用整数(如1,2,...),不能使用字符串形式的索引(如'1')(引用[2])。 6. 插入NULL值的情况:如果字段定义为非NULL,则插入NULL会失败(引用[4])。 用户的问题是关于查询的,因此我们需要重点解释如何正确查询ENUM类型的字段。 根据引用[2]中的示例: - 正常查询:`select * from test_gender where gender='M'` (正确) - 小写查询:`select * from test_gender where gender='m'` (也能查询出大写数据,因为不区分大小写) - 整数索引查询:`select * from test_gender where gender=1` (可以查询出结果,这里的1代表第一个枚举值,即'M') - 字符串索引查询:`select * from test_gender where gender='1'` (查询结果为空,因为字符串'1'不被认为是索引,而是试图匹配枚举值,而枚举值中没有'1') 因此,在查询ENUM类型字段时,我们需要注意: 1. 可以直接使用枚举值(字符串)进行查询,且不区分大小写。 2. 可以使用整数索引进行查询,但必须用整数,不能用字符串形式的整数。 3. 避免使用不在枚举列表中的值进行查询,否则可能返回空结果。 另外,引用[4]提到,如果插入了不在枚举列表中的值,在非严格模式下,该字段会被存储为''(空字符串),并且其内部索引值为0。因此,查询时如果使用`where 枚举字段=0`,可以查询出这些错误插入的记录(因为索引0对应空字符串),而使用`where 枚举字段=''`也可以查询出这些记录(因为存储的值是空字符串)。 现在,我们根据以上信息来回答用户的问题。</think>### MySQL ENUM枚举类型的查询问题分析 #### 1. **ENUM类型的基本查询规则** - **字符串查询不区分大小写** 查询时ENUM字段不区分大小写,例如`WHERE gender='m'`和`WHERE gender='M'`效果相同[^2]。 - **索引查询仅支持整数** 可通过枚举值的索引位置查询(索引从1开始),但**必须使用整数**: ```sql SELECT * FROM table WHERE enum_column = 1; -- 有效,返回第一个枚举值 SELECT * FROM table WHERE enum_column = '1'; -- 无效,返回空结果[^2] ``` #### 2. **特殊值查询场景** - **空字符串值查询** 当插入非法值时(非严格模式),字段会存储为空字符串: ```sql SELECT * FROM table WHERE enum_column = ''; -- 查询所有非法值记录 ``` - **索引0查询** 非法值在内部存储为索引0: ```sql SELECT * FROM table WHERE enum_column = 0; -- 等价于空字符串查询[^4] ``` #### 3. **查询性能注意事项** - **索引使用限制** ENUM类型虽以整数存储,但字符串查询仍可能触发全表扫描(如`WHERE enum_column='value'`),建议对高频查询字段建立索引[^3]。 - **类型转换风险** 混合使用字符串和整数查询可能导致隐式类型转换,影响性能: ```sql SELECT * FROM table WHERE enum_column = '2'; -- 字符串条件,索引失效 SELECT * FROM table WHERE enum_column = 2; -- 整数条件,可用索引 ``` #### 4. **设计层面的查询影响** - **枚举值修改问题** 修改ENUM定义(如`ALTER TABLE ... MODIFY COLUMN`)可能导致历史数据查询异常: ```sql -- 原定义:enum('a','b') ALTER TABLE table MODIFY enum_column enum('x','y','z'); -- 历史数据'b'在新枚举中不存在,查询时返回空字符串[^1][^4] ``` - **跨数据库兼容性** ENUM类型在其他数据库(如PostgreSQL)中不被支持,迁移时需重写所有相关查询语句[^3]。 > **关键总结**:ENUM查询需严格区分字符串和整数查询方式,警惕非法值导致的空字符串结果,修改枚举定义可能破坏现有查询逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值