无法对int字段mysql查询执行按位OR运算

时间:2012-01-06 08:53:40

标签: mysql bit-manipulation or-operator

简而言之

假设我的表中的int类型字段包含任何二进制四位数字(0和1的组合,例如1010,0110等)。如何有选择地仅更新其中一些数字而不更改其他数字。

详情
我的user_relevance_code表(类型为permissions)中有一个int(10)字段,该字段存储四个数字,表示此特定权限与哪些帐户类型相关。这四个数字存储1或0,表示它是否相关。从左到右,存储与这些帐户类型的相关性 - ManagerPublisherAdvertiserDeveloper。因此,此字段中存储的值0110表示它与经理,发布商相关且与广告商无关。

现在,在任何时候,假设我需要将其中一些权限标记为与管理者相关,或者使其与广告客户和发布商相关,同时使其与管理者无关,以及所有此类随机操作。对于所有这些情况,我需要保持其他数字不变。这意味着,如果我只需要更新经理相关性数字,我就不应该触及发布商和广告客户的数字。

问题
很明显,我需要对我需要应用当前值user_relevance_code的代码执行二进制OR并存储它,但这对我不起作用。

对于使某些权限与发布者相关的操作,我尝试了此查询 -

update permissions set user_relevance_code = (0100 | user_relevance_code) where <condition to update some permissions>

但这并没有产生预期的结果。之前有1000的那些记录已更新为1004,我希望它们成为1100(仅将第二个数字更新为1并保留其他数字)。

我还尝试将该字段的类型更改为binary。我想我做错了。

1 个答案:

答案 0 :(得分:2)

在MySQL中,0100是一个十进制数,而不是一个基数为2的数字,这就是为100 | 1000得到1004的原因。如果要确保设置2 2 位,则需要这样:

user_relevance_code = b'100' | user_relevance_code

或者,如果您希望明确指定所有四位(当有点争吵时这是一个好主意):

user_relevance_code = b'0100' | user_relevance_code

以上所有内容都假设您确实在您的user_relevance_code而不是基数为10的数字(例如1000,1101,110 ......)中存储了恰好看起来像二进制的位图。如果值确实是十进制的,那么位操作不是这项工作的最佳工具,你可能想要使用像这样令人不快的东西:

user_relevance_code = (user_relevance_code div 1000) * 1000 + 100 + (user_relevance_code % 100)

强制10 2 数字为1而另外三个数字。

我不得不说,在SQL中进行有点争吵并不是一件很自然的事情。单独的(用户,权限)关联表将更加自然。然后,您将使用简单的连接,插入和删除操作权限集。当然,如果您无法控制架构,那么您必须使用您拥有的内容。