赞
踩
标签(空格分隔): MYSQL
SET 类型与 ENUM 类型相似。使用她指定一个 permitted values 列表。但是 SET 类型的字段可以写入列表范围内的多个值。通常,我们在一个字段存储一个值,例如,一个会员拥有一个name,一个town。SET 类型让我们可以在一个字段存储多个值。例如我们可以在一个字段存储会员的多个电话号码。
但是 SET 类型的permitted values数目不能太多,最多只能包含64个值。
CREATE TABLE teams_new(
teamno INTEGER NOT NULL PRIMARY KEY,
playerno INTEGER NOT NULL,
division SET ('first','second','third','fourth')
)
小结:
在 SET 关键字后面使用括号列出 permitted values。这些值必须是字符表达式,即使permitted values 是一个数字序列,也必须写成字符字面量形式。
permitted values 有时也被称作 elements。divsion 字段由4个 element 组成。
插入数据行时,SET 类型的字段的元素必须在一个字符字面量中并且通过逗号分隔。
mysql> INSERT INTO teams_new VALUES (1, 27, 'first');
Query OK, 1 row affected (0.80 sec)
mysql> INSERT INTO teams_new VALUES (2, 27, 'first,third');
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO teams_new VALUES (3, 27, 'first,third,sixth');
ERROR 1265 (01000): Data truncated for column 'division' at row 1
mysql> INSERT INTO teams_new VALUES (4, 27, 'first,fifth');
ERROR 1265 (01000): Data truncated for column 'division' at row 1
mysql> INSERT INTO teams_new VALUES (5, 27, NULL);
Query OK, 1 row affected (0.07 sec)
mysql> INSERT INTO teams_new VALUES (6, 27, 7);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO teams_new VALUES (7, 27, CONV(1001,2,10));
Query OK, 1 row affected (0.07 sec)
mysql> SELECT * FROM teams_new;
+--------+----------+--------------------+
| teamno | playerno | division |
+--------+----------+--------------------+
| 1 | 27 | first |
| 2 | 27 | first,third |
| 5 | 27 | NULL |
| 6 | 27 | first,second,third |
| 7 | 27 | first,fourth |
+--------+----------+--------------------+
5 rows in set (0.00 sec)
小结:第一行值添加了一个值 first,第二行添加了两个值,这两个值不是指定为两个字面量,而是一个字面量,即 ‘first,third’而不是‘first’,’third’.
第三行,第四行包含超出范围的值,报错。第五行输入 NULL 。第六行指定了三个值。
同 ENUM 类型一样,SET 类型字段并没有存储实际值,而是存储一个64个长度的二进制字符串。在这个字符串中,如果这个列的第一个值出现了,右数第1位是1,否则就是0。如果集合中第二个值出现了,右数第2位是1,否则就是0,以此类推。
mysql> SELECT teamno teamno,division * 1,BIN(division * 1) FROM teams_new;
+--------+--------------+-------------------+
| teamno | division * 1 | BIN(division * 1) |
+--------+--------------+-------------------+
| 1 | 1 | 1 |
| 2 | 5 | 101 |
| 5 | NULL | NULL |
| 6 | 7 | 111 |
| 7 | 9 | 1001 |
+--------+--------------+-------------------+
5 rows in set (0.00 sec)
小结:
通过 divsion * 1 ,我们可以显示内部值。使用 BIN函数把 DECIMAL值转为二进制,并且可以看到MYSQL使用的位模式。注意,这个位模式可以相当长。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。