日常提交

This commit is contained in:
wu xiangkai
2022-10-09 19:02:34 +08:00
parent 2bf8e02062
commit 1c1cf55739

View File

@@ -425,7 +425,61 @@ CREATE TABLE sizes (
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';
```