日常提交
This commit is contained in:
@@ -425,7 +425,61 @@ CREATE TABLE sizes (
|
|||||||
size ENUM('small', @mysize, 'large')
|
size ENUM('small', @mysize, 'large')
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
### set类型
|
||||||
|
set类型是一个字符串类型,其可以含有0个或多个值,每个值都从许可值的范围内选择。set类型的值由一系列set类型的成员组成,成员之间通过逗号','分隔。
|
||||||
|
```sql
|
||||||
|
# 例如,set('one','two')类型,可以含有如下可能值
|
||||||
|
'one'
|
||||||
|
'one,two'
|
||||||
|
'two'
|
||||||
|
''
|
||||||
|
```
|
||||||
|
每个set类型最多可以含有64个不同的成员,再set类型字段定义时,如果为set类型字段指定重复的set成员,会触发警告或抛出异常(取决于strict sql mode是否被开启)。
|
||||||
|
> 在set类型字段的定义中,如果set类型的成员含有尾随空格,那么尾随空格将会在表创建时自动被移除。
|
||||||
|
|
||||||
|
***可以为set类型字段分配字符集和collate,对于二进制或者大小写敏感的collate,在赋值时大小写是敏感的。***
|
||||||
|
> 默认情况下,set类型字段和字符集和collate与数据表相同,在对set类型字段赋值或者进行比较时并不会区分大小写。
|
||||||
|
|
||||||
|
#### set类型值的存储
|
||||||
|
mysql通过整型来存储set的值,每个候选值对应整型的一个bit。
|
||||||
|
| set member | decimal value | binary value |
|
||||||
|
| :-: | :-: | :-: |
|
||||||
|
| 'a' | 1 | 0001 |
|
||||||
|
| 'b' | 2 | 0010 |
|
||||||
|
| 'c' | 4 | 0100 |
|
||||||
|
| 'd' | 8 | 1000 |
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# 如果mysql赋值给set类型字段的值为9,
|
||||||
|
# 则代表该set类型值组成为8+1
|
||||||
|
# 则set字段值为'a,d'
|
||||||
|
```
|
||||||
|
如果一个set类型的值含有多个set元素,那么元素之间的排列顺序并没有影响,'a,d'和'd,a'完全相同,值均为9.并且,对于set类型的值,其中一个元素出现的次数也对set值完全没有影响,'a,d,d,d,a,d,a'和'a,d'也完全相同,值均为9.
|
||||||
|
#### set类型的值赋值即错误处理
|
||||||
|
对于set类型,如果赋值中出现了一个定义该set类型字段时没有出现的元素,那么mysql会进行如下处理:
|
||||||
|
- 若strict sql mode开启,那么会产生异常
|
||||||
|
- 如果strict sql mode关闭,那么该值会被忽略,赋值正常执行,并且产生一个warning
|
||||||
|
#### set类型值中查找某set元素是否存在
|
||||||
|
对于在set值中查找某元素是否存在,可以通过find_in_set(eleVal,setVal)函数或者like操作符。find_in_set会返回元素在set值中第一次出现的位置,如果元素在set值中没有出现,那么会返回0.
|
||||||
|
```sql
|
||||||
|
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
|
||||||
|
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
|
||||||
|
```
|
||||||
|
想要查找set值中是否存在某元素,同样可以通过如下方法:
|
||||||
|
```sql
|
||||||
|
# 查找set值中是否存在第一个元素'a'
|
||||||
|
mysql> SELECT * FROM tbl_name WHERE set_col & 1;
|
||||||
|
```
|
||||||
|
想要对set值进行精准比较,可以通过如下方法
|
||||||
|
```sql
|
||||||
|
# 在比较时,
|
||||||
|
# set_col='val1,val2'
|
||||||
|
# 和
|
||||||
|
# set_col='val2,val1'
|
||||||
|
# 的返回结果是不同的,在指定set值是元素值顺序应该按照定义set列时
|
||||||
|
# 指定的顺序
|
||||||
|
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user