【问题标题】:Unable to do bitwise OR operation on int field mysql query无法对 int 字段 mysql 查询执行按位或运算
【发布时间】:2012-02-04 00:56:34
【问题描述】:

简述

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

详情
我的permissions 表(类型为int(10))中有一个user_relevance_code 字段,它存储了四位数字,表示与此特定权限相关的帐户类型。这四个数字分别存储一个 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(仅将第2 位更新为1,其他保持不变)。

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

【问题讨论】:

    标签: mysql bit-manipulation or-operator


    【解决方案1】:

    在 MySQL 中,0100 是一个十进制数,而不是一个以 2 为底的数字,这就是为什么 100 | 1000 会得到 1004。如果您想确保设置了 22 位,那么您需要:

    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)
    

    强制将 102 数字设为 1,而其他三个则不受影响。

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

    【讨论】:

    • 非常感谢您的解释,但select (b'0100' | user_relevance_code) from ox_permissions where user_relevance_code = 1000 也显示1004update ox_permissions set user_relevance_code = (b'1000' | user_relevance_code) where user_relevance_code = 1000 不进行更新。不确定我是否遗漏了什么。
    • @Sandeepan:where user_relevance_code = 1000 使用十进制值。你的桌子实际上是什么样子的?数据到底是什么样的? user_relevance_code 真的是位图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2017-01-11
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多