MySql 字符串类型 - enum、set

284 阅读2分钟
  • enum 类型和 set 类型都是用于存储“有给定值的可选字符”,比如类似表单中的单选,多选,下拉列表。

  • enum 类型(单选类型/枚举类型) : enum 类型通常用于存储表单中的“单选项”的值。 设定形式: enum('选项值1','选项值2','选项值3'.....) 这些选项值都对应了相应的“索引值”,类似素引数组的下标,但是从1开始的。 即这些选项的索引值分别为: 1,2,3, 4,... enum 类型最多可设定6535个选项。

    示例: create table tab1 (id int, edu('大学','中学','小学') ); insert into tab1 (id,edu) values(1, ‘大学"); 或: insert into tab1 (id, edu)values (1,2); // 表示中学


  • set 类型(多选类型) : set 类型通常用于存储表单中的“多选项”的值。 设定形式: set('选项值1','选项值2','选项值3'.....) 这些选项值都对应了相应的“索引值”,其索引值从1开始,并“依次翻倍”。 即这些选项的索引值分别为: 1,2,4,8, 16, ... (其实就是 2的n次方) enum类型最多可设定64个选项值。

    示例: create table tab2 (aihao enum('篮球','排球','足球') ); // 对应索引值为1,2,4,8 insert into tab2 (aihao) values('篮球'); 或: insert into tab2 (aihao) values('篮球,排球'); 或: insert into tab2 (aihao) values( '篮球,排球,足球'); 或: insert into tab2 (aihao) values(2); // 表示排球 (2) 或: insert into tab2 (aihao) values(3); // 表示 '篮球,排球' (1+2) 或: insert into tab2 (aihao) values (7); // 表示 '篮球,排球,足球' (1+2+4)


mysql> create table enumTest (id int auto_increment primary key, user_name varchar(20), user_pass varchar(32), edu enum('小学', '中学', '大学'), likes set('篮球', '足球', '排球'));
mysql> desc enumTest;
+-----------+----------------------------------+------+-----+---------+----------------+
| Field     | Type                             | Null | Key | Default | Extra          |
+-----------+----------------------------------+------+-----+---------+----------------+
| id        | int(11)                          | NO   | PRI | NULL    | auto_increment |
| user_name | varchar(20)                      | YES  |     | NULL    |                |
| user_pass | varchar(32)                      | YES  |     | NULL    |                |
| edu       | enum('小学','中学','大学')         | YES  |     | NULL    |                |
| likes     | set('篮球','足球','排球')          | YES  |     | NULL    |                |
+-----------+----------------------------------+------+-----+---------+----------------+

mysql> insert into enumTest (user_name, user_pass, edu, likes) values ('user1', '123', '小学', '篮球');
mysql> select * from enumTest;
+----+-----------+-----------+--------+--------+
| id | user_name | user_pass | edu    | likes  |
+----+-----------+-----------+--------+--------+
|  1 | user1     | 123       | 小学   | 篮球    |
+----+-----------+-----------+--------+--------+

mysql> insert into enumTest (user_name, user_pass, edu, likes) values ('user2', '123', '中学', '篮球,排球');
mysql> select * from enumTest;
+----+-----------+-----------+--------+---------------+
| id | user_name | user_pass | edu    | likes         |
+----+-----------+-----------+--------+---------------+
|  1 | user1     | 123       | 小学   | 篮球           |
|  2 | user2     | 123       | 中学   | 篮球,排球       |
+----+-----------+-----------+--------+---------------+

mysql> insert into enumTest (user_name, user_pass, edu, likes) values ('user3', '123', '大学', '篮球,排球,太阳');
ERROR 1265 (01000): Data truncated for column 'likes' at row 1

mysql> insert into enumTest (user_name, user_pass, edu, likes) values ('user2', '123', 2, 4);
mysql> select * from enumTest;
+----+-----------+-----------+--------+---------------+
| id | user_name | user_pass | edu    | likes         |
+----+-----------+-----------+--------+---------------+
|  1 | user1     | 123       | 小学   | 篮球           |
|  2 | user2     | 123       | 中学   | 篮球,排球       |
|  3 | user2     | 123       | 中学   | 排球           |
+----+-----------+-----------+--------+---------------+