MySQL中的MAKE_SET()函数可以根据一个整数位掩码,从后面的字符串参数中挑选出对应位为1的那些值,用逗号拼接成结果。但在实际使用中,这个函数可能直接返回NULL,了解它何时以及为何返回NULL,对写出稳定的SQL很重要。

MAKE_SET()基本用法
函数签名如下:
MAKE_SET(bits, str1, str2, ...)
其中bits为整数,如果第1位为1则取str1,第2位为1则取str2,以此类推。例如:
SELECT MAKE_SET(3, 'a', 'b', 'c'); -- 返回 'a,b' 因为 3 的二进制是 011,取前两位
什么情况下返回NULL
当MySQL的MAKE_SET()函数返回NULL时,通常有以下几种典型场景:
- 第一个参数bits为NULL,函数直接返回NULL。
- 字符串参数列表中只要出现一个NULL,且对应位被选中,则最终结果变成NULL。
- bits为0时,没有位被选中,返回空字符串而不是NULL,这一点容易混淆。
bits为NULL的示例
SELECT MAKE_SET(NULL, 'a', 'b'); -- 返回 NULL
字符串列表含NULL且被选中
SELECT MAKE_SET(1, NULL, 'b'); -- 返回 NULL,因为第1位为1且对应字符串是NULL
返回NULL意味着什么
在查询中如果MAKE_SET()返回NULL,那么该行对应表达式的值就是空标记,参与拼接或条件判断时都会按NULL规则处理。例如使用CONCAT组合时会整体变NULL:
SELECT CONCAT('权限:', MAKE_SET(1, NULL, '读')) AS info;
-- 返回 NULL
若想避免这种情况,可以用IFNULL包裹,或确保传入的字符串参数都不为NULL:
SELECT MAKE_SET(1, IFNULL(NULL, ''), '读'); -- 返回 ''
实践建议
| 场景 | 建议 |
|---|---|
| 位掩码可能为空 | 用IFNULL(bits, 0)保证不返回NULL |
| 字符串来源含空值 | 用IFNULL或COALESCE替换NULL为默认串 |
| 需要区分空串与NULL | 显式判断MAKE_SET结果是否为NULL |
总之,当MySQL的MAKE_SET()函数返回NULL时,说明输入参数不满足安全生成集合的条件,应当在SQL层做好防御式处理,才能让报表与接口数据更可控。