Mysql数据类型---SET

来源:互联网 发布:vb中index 编辑:程序博客网 时间:2024/06/09 00:49

标签(空格分隔): MYSQL


SET 类型与 ENUM 类型相似。使用她指定一个 permitted values 列表。但是 SET 类型的字段可以写入列表范围内的多个值。通常,我们在一个字段存储一个值,例如,一个会员拥有一个name,一个town。SET 类型让我们可以在一个字段存储多个值。例如我们可以在一个字段存储会员的多个电话号码。

但是 SET 类型的permitted values数目不能太多,最多只能包含64个值。

创建 teams_new 表,包含teamno,playerno,division字段,其中division字段为 SET 类型

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 1mysql> INSERT INTO teams_new VALUES (4, 27, 'first,fifth');ERROR 1265 (01000): Data truncated for column 'division' at row 1mysql> 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,以此类推。

显示 division字段内部类型

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使用的位模式。注意,这个位模式可以相当长。

原创粉丝点击