2

简单来说

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

详细信息
我的表中有一个user_relevance_code字段permissions(类型为int(10)),它存储四位数字,代表此特定权限与哪些帐户类型相关。这四个数字分别存储一个 1 或 0,表示它是否相关。从左到右,存储与这些帐户类型的相关性 - ManagerPublisherAdvertiserDeveloper。因此,0110存储在此字段中的值意味着它与经理、发布商相关,而与广告商无关。

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

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

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

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

但这并没有产生预期的结果。那些1000较早的记录已更新到1004我希望它们成为的位置1100(仅将第 2 位更新为 1 并将其他记录保持原样)。

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

4

1 回答 1

2

在 MySQL 中,0100是一个十进制数,而不是一个以 2 为底的数字,这就是为什么你得到 1004 的原因100 | 1000。如果要确保设置了 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 中,有点争论确实不是一件自然的事情。单独的(用户、权限)关联表会更自然。然后,您将使用简单的连接、插入和删除操作权限集。当然,如果您无法控制架构,那么您必须使用您所拥有的。

于 2012-01-06T09:23:36.230 回答