gpt4 book ai didi

mysql - 无法对 int 字段 mysql 查询进行按位或运算

转载 作者:行者123 更新时间:2023-11-29 02:33:39 24 4
gpt4 key购买 nike

简述

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

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

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

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

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

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

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

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

最佳答案

在 MySQL 中,0100 是十进制数,而不是 base-2 数,这就是为什么 100 | 会得到 1004 | 1000。如果你想确保设置了 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)

强制第 10 个2 位为 1,而其他三个保持不变。

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

关于mysql - 无法对 int 字段 mysql 查询进行按位或运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8755409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com