MySQL SET,ENUM类型数据小结

本文通过具体实例详细解析了MySQL中的SET与ENUM两种特殊的数据类型。介绍了SET类型的存储原理及使用限制,以及ENUM类型的使用场景和注意事项。

mysql中set和enum类型变量小结

以一个实例来说明:

mysql>create table t1 (

id tinyint unsigned auto_increment not null ,
c1 SET('x','y','z') not null ,
c2 ENUM('one','two','three'),
primary key('id')
)engine=innodb  ;
mysql> insert into t1 (c1,c2) values(1,1),(2,1),(3,1),(4,1)(5,1),(6,1),(7,1);
mysql> select * from t1;
+-------+------+----+
| c1    | c2   | id |
+-------+------+----+
| x     | one  |  1 |
| y     | one  |  2 |
| x,y   | one  |  3 |
| z     | one  |  4 |
| x,z   | one  |  5 |
| y,z   | one  |  6 |
| x,y,z | one  |  7 |
+-------+------+----+
注意:此时插入下面这条值将报错
mysql> insert into t1 (c1,c2) values(8,1);
ERROR 1265 (01000): Data truncated for column 'c1' at row 1

备注: 
SET类型,属于二进制字符串类型,集合型,以二进制的位数来表示集合中对应元素。超过set定义的数值范围(10进制),即set定义的元素个数n,
最大值为(2^(n+1) -1)。如上定义,则对应位数与元素关系为:
0001---->x 
0010---->y 
0100---->z 
则c1的最大10进制数=2^4 -1 =7 ,超过此值将报错。

接下来验证ENUM()枚举型值

mysql> insert into t1 (c1,c2) values(1,2),(1,3);

注意:此时插入的值将报错
mysql> insert into t1 (c1,c2) values(1,4);
ERROR 1265 (01000): Data truncated for column 'c2' at row 1

备注: 
ENUM类型,属于枚举型数据,每次只能选取其中一个元素。以10进制的数字对应enum中定义的元素位数,超过enum定义范围的将报错。

### MySQLENUM 数据类型的定义、用法特性 #### 1. 定义 ENUM 是一种特殊的字符串对象,其值必须是预定义集合中的一个。它在创建表时通过指定可能的值来定义,字段的值只能是枚举列表中的一个[^4]。这种数据类型非常适合存储有限选项的场景,例如星期('Monday', 'Tuesday', 'Wednesday' 等)或状态('Open', 'Closed', 'Pending' 等)。 #### 2. 使用场景 ENUM 类型适用于以下场景: - 存储具有固定选项的数据,例如性别('Male', 'Female')、状态('Active', 'Inactive')等。 - 需要确保字段值的完整性一致性,避免输入无效值。 - 在存储空间查询效率方面具有一定优势的场景[^2]。 #### 3. 特性 - **存储效率**:MySQL 内部将 ENUM 值存储为整数索引,从而节省存储空间。如果枚举列表包含少于或等于 255 个元素,则使用 1 字节存储;否则使用 2 字节存储[^5]。 - **排序与比较**:ENUM 值按照定义时的顺序进行排序比较,而不是基于字符串的字典顺序[^4]。 - **默认值处理**:如果插入的值不在枚举列表中,MySQL 将其视为错误,并根据 SQL 模式决定是否插入空字符串或生成警告信息[^5]。 - **索引支持**:ENUM 字段可以被索引,以加速查询操作[^4]。 #### 4. 示例代码 以下是一个使用 ENUM 数据类型的示例: ```sql CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), status ENUM('Active', 'Inactive', 'Terminated') NOT NULL ); ``` 在上述代码中,`status` 字段使用了 ENUM 类型,允许的值为 'Active', 'Inactive' 'Terminated'。 插入数据时,只能使用预定义的枚举值之一: ```sql INSERT INTO employees (name, status) VALUES ('John Doe', 'Active'); INSERT INTO employees (name, status) VALUES ('Jane Smith', 'Inactive'); ``` 尝试插入无效值会导致错误: ```sql INSERT INTO employees (name, status) VALUES ('Alice Johnson', 'Unknown'); -- 错误 ``` #### 5. 注意事项 - 如果需要更改 ENUM 列的值列表,必须使用 `ALTER TABLE` 语句,这可能会导致表锁定性能问题。 - ENUM 的值是区分大小写的,因此在定义插入时需注意大小写的一致性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值