如何将位掩码应用于MySQL中的整数?

cg2*_*g22 4 mysql integer type-conversion

相反,这是一个奇怪的问题:

数据库Rx30将处方的状态存储在称为"Rxstatus"的字段中.它们存储的数字是从字节转换的整数,并且永远不会高于255.显然,转换前设置的位确定脚本是否已填充.

令人困惑,对吧?一位代表告诉我们,如果设置了16,32或128,则该脚本被视为"未填充".所以那很好,还有什么可以继续.

所以现在我们要做的是取一个整数,比如'49',然后看看哪些是设置的.为了速度,这需要通过MySQL完成.所以我明白49是:

32+16+1 = 49
Run Code Online (Sandbox Code Playgroud)

因此在此字段中设置了16,因此脚本未填充.

我不能为我的生活理解为什么他们决定创建他们的数据库以这种方式工作,但我必须与他们给我的东西一起工作.有没有人知道我可以取一个整数的方法,例如152,并确定它的哪些位置?

一旦我们确定了什么设置,如果设置了16,32或128,我们可以认为脚本未填充并产生正确的结果.我知道这很令人困惑,但如果有人知道这种方法可以通过MySQL完全在后端完成,那将对我有很大的帮助.

Bar*_*mar 9

如果您有测试位掩码,例如32+16+1 = 49,并且您想知道是否设置了其中任何一个,则Rxstatus使用:

SELECT Rxstatus & 49 != 0
Run Code Online (Sandbox Code Playgroud)

如果您想知道是否所有这些都已设置,您可以使用:

SELECT Rxstatus & 49 = 49
Run Code Online (Sandbox Code Playgroud)

要设置位掩码中的所有位,请执行以下操作:

UPDATE Rx30
SET Rxstatus = Rxstatus | 49
WHERE <condition>
Run Code Online (Sandbox Code Playgroud)

要取消设置位掩码中的所有位,您可以:

UPDATE Rx30
SET Rxstatus = Rxstatus & ~49
WHERE <condition>
Run Code Online (Sandbox Code Playgroud)


cg2*_*g22 -1

在查看了这里的一些答案并与一些同事讨论后,我们通过检查转换后的长度得到了正确的结果:

LENGTH( CONV( Rxstatus, 10, 2 ) ) NOT IN ( 5, 6, 8 ))
Run Code Online (Sandbox Code Playgroud)

例如,我们使用字段的长度来确定数字是否被设置。如果该字段中设置了 5、6 或 8,则必须存在 16、32 或 128。

10000    (Length 5, = 16)
100000   (Length 6, = 32)
10000000 (Length 8, = 128)
Run Code Online (Sandbox Code Playgroud)

仅长度本身就为我们提供了必须设置的值。感谢大家的帮助,在短短 30 分钟内解决了这个问题!

查询在 0.23 秒内运行了超过 460,000 个字段。:D