1.set字段基本说明
2.set字段基本使用
3.set字段特殊处理
1.SET字段的值作为字符串处理,更新列p927,统一删除为10的值
UPDATE datp0 SET p927 = REPLACE (REPLACE(REPLACE(p927,',10',''),'10,',''),'10','') WHERE FIND_IN_SET(10,p927)>0;
2.SET字段的值作为字符串处理,更新列p927,统一新增10的值
UPDATE datp0 SET p927 = CONCAT(p927,IF((p927 IS NULL OR p927=''),'10',',10'))
4.set字段的值,取某一个位置的值
1)取第一个
select LEFT(字段,1) WHERE 字段!='' OR 字段IS NOT NULL;
2)取中间的某一个
select substring_index(substring_index(该字段, ',', 2) , ',', -1) from 表名;
这一条借鉴的文章地址:Mysql字符串截取
需要先判断是否存在第二项,第三项,否则最后的结果都是第一个。
判断set里面包含的值得数量
SELECT LENGTH(字段)-LENGTH(REPLACE(字段,',','')) from 表名
3)取最后一个
select RIGHT(字段,1) WHERE 字段!='' OR 字段IS NOT NULL;
5 mysql数据库set类型修改为int类型时,值的变化
1)set类型
字段定义为:
`p254` set('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','99') DEFAULT NULL
字段包含的值:(NULL),'',0,1,2
执行字段定义修改语句:
ALTER TABLE datp0 MODIFY p254 INT(2) DEFAULT NULL COMMENT '';
之后比较修改前后的两个值对比发现,修改前后的值不一致。对应关系为:
执行前--》执行后 NULL-->NULL;''-->0;0-->1;1-->2;2-->4
6.将set类型的改为int类型,需要将值保留的处理
1) 修改前字段定义:
CREATE TABLE `datp111` (
`datid` int(11) NOT NULL,
`p1207` set('1','2','3','4') DEFAULT NULL,
PRIMARY KEY (`datid`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
2)备份值
需要对值进行处理,set存在多个值的,只要判断值里面包含逗号,非原创链接,https://www.php.cn/mysql-tutorials-442230.html
set中的空值需要替换为特定的值,目前是处理为-1,其他的使用concat转为字符串
CREATE TABLE datp111_part_tmp AS SELECT datid,if(p1207 !='' ,concat(p1207,''),'-1') p1207 FROM datp111;
3)设置旧字段为NULL
update datp111 set p1207=null;
4)修改字段类型
alter table datp111 modify p1207 int;
5)将旧值赋值到修改类型后的字段
UPDATE datp111 d, datp111_part_tmp d1 SET d.p1207=d1.p1207 WHERE d.datid=d1.datid
6)删除之前建的表
drop table datp111_part_tmp;
7.int类型转为set类型
建表语句
CREATE TABLE `datp103` (
`datid` int(11) NOT NULL,
`p1526` varchar(11) DEFAULT NULL,
`p1559` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
处理语句
#-1是int类型默认值,处理为空,其他值转为字符串类型
drop table if exists datp103_part_tmp;
CREATE TABLE datp103_part_tmp AS SELECT datid,if(p1526 !='-1' ,concat(p1526,''),'') p1526,if(p1559 !='-1' ,concat(p1559,''),'') p1559 FROM datp103;
#字段所有值设置为NULL
UPDATE datp103 SET p1526=NULL,p1559=null;
#修改字段类型
ALTER TABLE datp103 MODIFY p1526 set('1','2','3','4','5','6','7','8','9','10','11','12','99') DEFAULT NULL, MODIFY p1559 SET('1','2','3','4','5','6','7','8','9','10','11','12','99') DEFAULT NULL;
#更新值
UPDATE datp103 d, datp103_part_tmp d1 SET d.p1526= concat(d1.p1526,''),d.p1559= CONCAT(d1.p1559,'') WHERE d.datid=d1.datid;