如何通过数值索引而非字面量更新MySQL的SET类型字段
问题原因
你之前的更新语句无法生效是因为REPLACE是字符串处理函数:当你传入数值参数时,MySQL会自动将SET类型的my_col转为逗号分隔的字符串(比如'C,C#'),再去匹配字符串中的'8'或'9'字符,自然匹配不到,因此不会产生任何更新效果。
正确操作方法
MySQL的SET类型本质是按位存储的整数,每个选项对应一个二进制位,直接通过位运算即可实现数值维度的更新,无需处理字符串字面量。
1. 替换指定选项(对应你将8(C#)替换为4(Java)的需求)
逻辑为:先清除要替换的选项对应的位,再添加新选项对应的位:
UPDATE my_set_table SET my_col = (my_col & ~8) | 4 WHERE id = 1;
& ~8:按位与8的取反值,清除C#对应的二进制位| 4:按位或4,添加Java对应的二进制位
执行后id=1的my_col值变为1+4=5,对应内容为C,Java,和你用字面量替换的效果完全一致。
2. 直接覆盖整个SET值(对应你将9替换为5的需求)
如果要直接替换整个字段的数值,不需要用REPLACE,直接赋值即可:
UPDATE my_set_table SET my_col = 5 WHERE id = 1;
其他常见数值操作示例
- 给指定记录添加Python(对应数值128):
UPDATE my_set_table SET my_col = my_col | 128 WHERE id = 1; - 移除指定记录的Kotlin(对应数值32):
UPDATE my_set_table SET my_col = my_col & ~32 WHERE id = 2; - 切换JavaScript(对应数值16)的选中状态(有则移除,无则添加):
UPDATE my_set_table SET my_col = my_col ^ 16 WHERE id = 3;
内容的提问来源于stack exchange,提问作者Payel Senapati
相关产品推荐
相关产品推荐

