MySQL查询判断位标志位设置状态的语句错误排查
错误原因
你编写的查询中,校验32标志位未设置的条件逻辑完全不符合位运算的校验规则:
32 != quest_template.Flag的作用是判断Flag字段的整体整数值不等于32,而非判断32对应的二进制位未启用。只要Flag同时包含其他位的数值,哪怕32对应的位已经被设置,这个条件也会返回真,因此无法实现你要的校验效果。
正确实现方案
位标志的状态校验统一使用按位与(&)运算即可:
- 校验某一位已设置:
对应位值 & Flag != 0,MySQL中非0值会被识别为真,也可以简写为对应位值 & Flag - 校验某一位未设置:
对应位值 & Flag = 0
修正后的查询语句如下:
SELECT * FROM quest_template WHERE quest_template.ID > 0 AND (64 & quest_template.Flag) != 0 AND (32 & quest_template.Flag) = 0;
你可以用你给出的当前值测试验证逻辑:
- 计算
64 & 824183885,结果为64(非0,符合64位已设置的要求) - 计算
32 & 824183885,结果为0则说明32位未设置,符合筛选要求。
内容的提问来源于stack exchange,提问作者Berstos
相关产品推荐
相关产品推荐

