enum

enum 枚举类型,声明符号名称来表示整形常量,占一个int类型的大小

enum COLOR 
{
	RED, BLUE, PINK, BLACK,GREY
};

int main(int argc, char* argv[])
{

	enum COLOR a;
	cout <<sizeof(a)<<endl;
	cout<<RED<<endl;
	cout<<BLUE<<endl;
	cout<<PINK<<endl;
	cout<<BLACK<<endl;
	return 0;
}

在这里插入图片描述
如果不给定初值,那么枚举类型的值从0 - n-1
枚举所占内存大小为4

如果给某个符号名称赋一个初值 N,这个符号名称后面的值为N+1 N+2 N+3…

enum COLOR 
{
	RED, BLUE = 10, PINK, BLACK,GREY
};

int main(int argc, char* argv[])
{

	enum COLOR a;
	cout <<sizeof(a)<<endl;
	cout<<RED<<endl;
	cout<<BLUE<<endl;
	cout<<PINK<<endl;
	cout<<BLACK<<endl;
	return 0;
}

在这里插入图片描述


enum COLOR 
{
	RED, BLUE = 10, PINK, BLACK = 1,GREY
};

int main(int argc, char* argv[])
{

	enum COLOR a;
	cout <<sizeof(a)<<endl;
	cout<<RED<<endl;
	cout<<BLUE<<endl;
	cout<<PINK<<endl;
	cout<<BLACK<<endl;
	cout<<GREY<<endl;
	return 0;
}

在这里插入图片描述

<think> 我们正在讨论ENUM数据类型,用户要求用中文回答,并在最后提出3-5个相关问题。 根据之前的对话历史,用户已经给出了关于ENUM的示例(在Staff表中用于gender列),并且我们之前已经详细解释了ENUM和CHECK约束等。 现在用户直接输入“ENUM”,可能是希望更深入地了解ENUM类型本身,比如其优缺点、使用场景、注意事项等。 回答结构: 1. 首先解释ENUM的概念和作用。 2. 详细说明其优点和缺点。 3. 对比其他方法(如CHECK约束或外键引用)。 4. 提供使用示例。 5. 注意事项。 由于用户之前已经有一个Staff表的例子,我们可以在此基础上扩展。 注意:最后必须提出3-5个相关问题,以“§§相关问题§§”开头,并且问题要围绕ENUM展开。 </think> ### ENUM 数据类型深度解析 #### 📌 ENUM 的核心特性 ENUM 是数据库中的枚举类型,用于严格限制字段取值范围。以 `gender ENUM ('M', 'F', 'N', 'U')` 为例: - **值域控制**:仅允许存储预定义的选项(`'M'/'F'/'N'/'U'`) - **存储优化**:实际存储为整数索引(1字节),而非字符串 - **默认值支持**:可设置 `DEFAULT 'U'` 避免空值 - **强约束**:插入非法值(如 `'X'`)将触发错误: ```sql ERROR 1265 (01000): Data truncated for column 'gender' ``` #### ⚖️ ENUM 优缺点对比 | **优势** | **劣势** | |----------|----------| | ✅ 声明简洁直观 | ❌ 修改选项需重建表(MySQL) | | ✅ 存储高效(比VARCHAR节约50%空间) | ❌ 跨数据库兼容性差(Oracle/PostgreSQL不支持) | | ✅ 查询性能优化(整数索引加速) | ❌ 选项上限65535个(MySQL限制) | | ✅ 与程序枚举类型无缝对接 | ❌ 无法存储附加元数据 | #### 🔧 创建与操作示例 ```sql -- 创建含ENUM的表 CREATE TABLE Users ( id INT PRIMARY KEY, status ENUM('active', 'pending', 'banned') DEFAULT 'pending' ); -- 合法插入 INSERT INTO Users VALUES (1, 'active'); -- 成功 -- 非法操作 INSERT INTO Users VALUES (2, 'expired'); -- 错误1265 ALTER TABLE Users MODIFY status ENUM('active','inactive'); -- 需重建表 ``` #### 🚨 关键注意事项 1. **空值处理**: - `ENUM('A','B')` 可插入 `NULL` - 若需禁止空值需显式声明 `NOT NULL` 2. **排序陷阱**: ```sql SELECT * FROM Users ORDER BY status; -- 按索引值排序(active=1, pending=2, banned=3),非字母序 ``` 3. **迁移风险**: - 从MySQL迁移到PostgreSQL时需转换为 `CHECK(gender IN(...))` 约束 4. **索引机制**: - ENUM 自动创建隐藏的整数索引列 - `WHERE status='active'` 实际执行整数比较 #### ⚡ 适用场景建议 - **推荐使用** ✔️ 固定且极少变更的选项集(如性别/布尔状态) ✔️ 存储敏感型字段(节约空间优先) - **避免使用** ✖️ 需要频繁增减选项的场景 ✖️ 多语言应用(需关联本地化文本表) ✖️ 需要扩展元数据的字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值