简而言之
假设我的表中的int
类型字段包含任何二进制四位数字(0和1的组合,例如1010,0110等)。如何有选择地仅更新其中一些数字而不更改其他数字。
详情
我的user_relevance_code
表(类型为permissions
)中有一个int(10)
字段,该字段存储四个数字,表示此特定权限与哪些帐户类型相关。这四个数字存储1或0,表示它是否相关。从左到右,存储与这些帐户类型的相关性 - Manager
,Publisher
,Advertiser
,Developer
。因此,此字段中存储的值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
。我想我做错了。
答案 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中进行有点争吵并不是一件很自然的事情。单独的(用户,权限)关联表将更加自然。然后,您将使用简单的连接,插入和删除操作权限集。当然,如果您无法控制架构,那么您必须使用您拥有的内容。