From 1c1cf55739539cd140263f90f3cb90000f65bed7 Mon Sep 17 00:00:00 2001 From: wu xiangkai Date: Sun, 9 Oct 2022 19:02:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/Data Type.md | 56 +++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/mysql/mysql文档/Data Type.md b/mysql/mysql文档/Data Type.md index 820fb39..597d087 100644 --- a/mysql/mysql文档/Data Type.md +++ b/mysql/mysql文档/Data Type.md @@ -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'; +```