我补充了迄今为止答案中已经提到的几点,因为我正在添加一个关于差异的附加点 -
MySQL 在内部将 ENUM 字符串值存储为值 1 到 n 的十进制整数,用于枚举中具有 n 个成员的列。
MySQL 将 SET 字符串值表示为一个位图,每个值使用一位,因此这些值在内部存储为 1、2、4、8、..... 最多 65,535 个,最多 64 个成员。
这点演示如下-
枚举示例 -
我创建表table1,列col1 的数据类型为ENUM('a','b','c','d','e','f','g','h','i','j'),表结构如下-
| table1 | CREATE TABLE `table1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`col1` enum('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
col1 内部存储如下 -
+----+---------+---------------+
| id | element | decimal_value |
+----+---------+---------------+
| 1 | a | 1 |
| 2 | b | 2 |
| 3 | c | 3 |
| 4 | d | 4 |
| 5 | e | 5 |
| 6 | f | 6 |
| 7 | g | 7 |
| 8 | h | 8 |
| 9 | i | 9 |
| 10 | j | 10 |
+----+---------+---------------+
现在,假设我们要将值 - 'e' 插入到 col1 中
'e' 的索引为 5
因此要将'e' 输入col1,我们使用以下查询-
INSERT INTO table1 VALUES (1, 5);
然后我们检查table1中存在的值-
SELECT * FROM table1;
+----+------+
| id | col1 |
+----+------+
| 1 | e |
+----+------+
我们看到,在第一行中,col1 的值为 'e'
再次,假设我们要将值 - 'i' 插入到 col1 中
'i' 的索引为 9
因此要将'i' 输入col1,我们使用以下查询-
INSERT INTO table1 VALUES (2, 9);
然后我们检查table1中存在的值-
SELECT * FROM table1;
+----+------+
| id | col1 |
+----+------+
| 1 | e |
| 2 | i |
+----+------+
我们看到,在第二行中,col1 的值为 'i'
再次,假设我们要将值 - 'a' 插入到 col1 中
'a' 的索引为 1
因此要将'a' 输入col1,我们使用以下查询-
INSERT INTO table1 VALUES (3, 1);
然后我们检查table1中存在的值-
SELECT * FROM table1;
+----+------+
| id | col1 |
+----+------+
| 1 | e |
| 2 | i |
| 3 | a |
+----+------+
我们看到在第三行我们将col1 的值设为'a'
SET 示例 -
我创建表table1,列col1,数据类型为SET('a','b','c','d','e','f','g','h','i','j'),表结构如下-
| table1 | CREATE TABLE `table1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`col1` set('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
col1 内部存储如下 -
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 1 | a | 0000 0000 0001 | 1 |
| 2 | b | 0000 0000 0010 | 2 |
| 3 | c | 0000 0000 0100 | 4 |
| 4 | d | 0000 0000 1000 | 8 |
| 5 | e | 0000 0001 0000 | 16 |
| 6 | f | 0000 0010 0000 | 32 |
| 7 | g | 0000 0100 0000 | 64 |
| 8 | h | 0000 1000 0000 | 128 |
| 9 | i | 0001 0000 0000 | 256 |
| 10 | j | 0010 0000 0000 | 512 |
+----+---------+----------------+---------------+
现在,假设我们要将值 - 'e,f,i' 插入到 col1 中
那么'e,f,i'的binary_value是通过将'e'、'f'和'i'的binary_value相加得到0001 0011 0000,对应的decimal_value就是304如下图-
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 5 | e | 0000 0001 0000 | 16 |
| 6 | f | 0000 0010 0000 | 32 |
| 9 | i | 0001 0000 0000 | 256 |
+----+---------+----------------+---------------+
| | e,f,i | 0001 0011 0000 | 304 |
+----+---------+----------------+---------------+
因此要将'e,f,i' 输入col1,我们使用以下查询-
INSERT INTO table1 VALUES (1, 304);
然后我们检查table1中存在的值-
SELECT * FROM table1;
+----+-------+
| id | col1 |
+----+-------+
| 1 | e,f,i |
+----+-------+
我们看到,在第一行中,col1 的值为 'e,f,i'
再次,假设我们要将值 - 'a,j' 插入到 col1 中
然后'a,j'的binary_value是'a'和'j'的binary_values相加,即0010 0000 0001,对应的decimal_value为513,如下图-
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 1 | a | 0000 0000 0001 | 1 |
| 10 | j | 0010 0000 0000 | 512 |
+----+---------+----------------+---------------+
| | a,j | 0010 0000 0001 | 513 |
+----+---------+----------------+---------------+
因此要将'a,j' 输入col1,我们使用以下查询-
INSERT INTO table1 VALUES (2, 513);
然后我们检查table1中存在的值-
SELECT * FROM table1;
+----+-------+
| id | col1 |
+----+-------+
| 1 | e,f,i |
| 2 | a,j |
+----+-------+
我们看到,在第二行中,col1 的值为 'a,j'
再次,假设我们要将值 - 'b,d,h,i' 插入到 col1
然后'b,d,h,i'的binary_value是通过将'b'、'd'、'h'和'i'的binary_value相加得到的,即0001 1000 1010,对应的decimal_value为394,如下图-
+----+---------+----------------+---------------+
| id | element | binary_value | decimal_value |
+----+---------+----------------+---------------+
| 2 | b | 0000 0000 0010 | 2 |
| 4 | d | 0000 0000 1000 | 8 |
| 8 | h | 0000 1000 0000 | 128 |
| 9 | i | 0001 0000 0000 | 256 |
+----+---------+----------------+---------------+
| | b,d,h,i | 0001 1000 1010 | 394 |
+----+---------+----------------+---------------+
因此要将'b,d,h,i' 输入col1,我们使用以下查询-
INSERT INTO table1 VALUES (3, 394);
然后我们检查table1中存在的值-
SELECT * FROM table1;
+----+---------+
| id | col1 |
+----+---------+
| 1 | e,f,i |
| 2 | a,j |
| 3 | b,d,h,i |
+----+---------+
我们看到在第三行我们将col1 的值设为'b,d,h,i'