Mysql数据类型---SET

标签(空格分隔): 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 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,以此类推。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值