MySQL数据库中的MAKE_SET函数是一种用于创建集合的函数。它接受字符串参数,参数由逗号分隔的值组成,并返回一个包含这些值的集合。MAKE_SET函数在处理字符串和集合操作时非常有用。通常用于concat等函数被禁止使用的场景,可以结合updatexml等函数进行报错注入。
make_set函数可以返回相应位的字符串,语法格式为:
MAKE_SET(bits,str1,str2,…)
bits将输入的值转为二进制 然后会倒过来,从低位到高位,去除1所对应位置的字符串并返回
在MAKE_SET(1,'mao1','mao2','365','com'),在实现二进制转换我们可以使用BIN函数,实现倒序可以用REVERSE函数。在1转换为二进制还是1,倒序也是1
mysql> select MAKE_SET(1,'mao1','mao2','365','com'),REVERSE(BIN(1)),BIN(1); +---------------------------------------+-----------------+--------+ | MAKE_SET(1,'mao1','mao2','365','com') | REVERSE(BIN(1)) | BIN(1) | +---------------------------------------+-----------------+--------+ | mao1 | 1 | 1 | +---------------------------------------+-----------------+--------+
在2转换为二进制倒序后是01对应是的第二位
mysql> select MAKE_SET(2,'mao1','mao2','365','com'),REVERSE(BIN(2)),BIN(2); +---------------------------------------+-----------------+--------+ | MAKE_SET(2,'mao1','mao2','365','com') | REVERSE(BIN(2)) | BIN(2) | +---------------------------------------+-----------------+--------+ | mao2 | 01 | 10 | +---------------------------------------+-----------------+--------+
在3转换为二进制倒序后是11对应的是第一位和第二位
mysql> select MAKE_SET(3,'mao1','mao2','365','com'),REVERSE(BIN(3)),BIN(3); +---------------------------------------+-----------------+--------+ | MAKE_SET(3,'mao1','mao2','365','com') | REVERSE(BIN(3)) | BIN(3) | +---------------------------------------+-----------------+--------+ | mao1,mao2 | 11 | 11 | +---------------------------------------+-----------------+--------+
bits为1 | 4 先取数字1的二进制为1 数字4的二进制为100 然后或运算后为 101 依旧倒过来为101 可以看到第一位和第三位为1 于是取第一位和第三位合并返回
mysql> select MAKE_SET(1|4,'mao1','mao2','365','com'),REVERSE(BIN(1)),BIN(1),REVERSE(BIN(4)),BIN(4); +-----------------------------------------+-----------------+--------+-----------------+--------+ | MAKE_SET(1|4,'mao1','mao2','365','com') | REVERSE(BIN(1)) | BIN(1) | REVERSE(BIN(4)) | BIN(4) | +-----------------------------------------+-----------------+--------+-----------------+--------+ | mao1,365 | 1 | 1 | 001 | 100 | +-----------------------------------------+-----------------+--------+-----------------+--------+
0和对应字符串为NULL时都返回空
mysql> select MAKE_SET(0,'mao1','mao2','365','com'),REVERSE(BIN(0)),BIN(0); +---------------------------------------+-----------------+--------+ | MAKE_SET(0,'mao1','mao2','365','com') | REVERSE(BIN(0)) | BIN(0) | +---------------------------------------+-----------------+--------+ | | 0 | 0 | +---------------------------------------+-----------------+--------+ mysql> select MAKE_SET(2,'mao1',NULL,'365','com'),REVERSE(BIN(2)),BIN(2); +-------------------------------------+-----------------+--------+ | MAKE_SET(2,'mao1',NULL,'365','com') | REVERSE(BIN(2)) | BIN(2) | +-------------------------------------+-----------------+--------+ | | 01 | 10 | +-------------------------------------+-----------------+--------+
在使用MAKE_SET函数时,请注意以下几点:
bits参数必须是一个无符号的整数,表示返回的集合中元素的位数。确保为该参数提供正确的值,以便确保集合中元素的正确位数。
values参数是一个字符串,包含用逗号分隔的位图值。每个值表示集合中的一个元素。确保字符串中的值正确且用逗号分隔。
当使用MAKE_SET函数时,如果提供的值在集合中已存在,它们不会被添加到集合中。因此,确保在添加元素之前检查它们是否已存在于集合中。
MAKE_SET函数返回的是一个集合,不是可修改的集合对象。对返回的集合进行修改将导致错误。如果您需要修改集合,请考虑使用其他MySQL集合操作函数来实现。