# 枚举和集合类型

__*ENUM 数据类型*__
__*SET 数据类型*__

+ 数据类型:
  + `ENUM`: 从枚举字符串值列表中选择单个字符串值
  + `SET`: 从字符串值列表中选择零个或多个字符串值
+ `ENUM` 示例:
  + `ENUM('Terrestrial', 'Jovian', 'Dwarf')`
+ `SET` 示例:
  + `SET('nose', 'head', 'eyes')`

```
tidb> DESC test.sss;
+-------+------------------+------+------+---------+-------+
| Field | Type             | Null | Key  | Default | Extra |
+-------+------------------+------+------+---------+-------+
| id    | ~!@set('A','B','C')@!~ | YES  |      | NULL    |       |
+-------+------------------+------+------+---------+-------+
tidb> INSERT INTO test.sss VALUES ('AAA');
ERROR 1265 (01000): Data truncated for column 'id' at row 1

tidb> INSERT INTO test.sss VALUES (~!@'C,B'@!~);
Query OK, 1 row affected (0.03 sec)
```
----------------------------------------------------------------
- ENUM 类型

- 枚举类型是一个字符串,它只能有一个值的字符串对象。其值必须是从一个固定集合中选取,这个固定集合在创建表的时候定义,语法是:
`ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]`
例如:
`ENUM('apple', 'orange', 'pear')`

- 枚举类型的值在 TiDB 内部使用数值来存储,每个值会按照定义的顺序转换为一个数字,比如上面的例子中,每个字符串值都会映射为一个数字:

值	   数字
NULL   NULL
''	     0
'apple'	 1
'orange' 2
'pear'	 3


- SET 类型

- 集合类型是一个包含零个或多个值的字符串,其中每个值必须是从一个固定集合中选取,这个固定集合在创建表的时候定义,语法是:
`SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]`
例如:
`SET('1', '2') NOT NULL`
上面的例子中,这列的有效值可以是:
''
'1'
'2'
'1,2'

- 集合类型的值在 TiDB 内部会转换为一个 Int64 数值,每个元素是否存在用一个二进制位的 0/1 值来表示,比如这个例子 SET('a','b','c','d'),每一个元素都被映射为一个数字,且每个数字的二进制表示只会有一位是 1:
  
成员	十进制表示	二进制表示
'a'	1	0001
'b'	2	0010
'c'	4	0100
'd'	8	1000
这样对于值为 ('a', 'c') 的元素,其二进制表示即为 0101。