MySQL 按位返回不正确的记录 SELECT

MySQL returning incorrect records to bitwise SELECT

任何人都可以深入了解这里出了什么问题吗?当 SELECT 语句完成时,我在 table 中使用 BIGINT(20) 字段来存储按位值(这里也有其他字段,但为了简单起见,我忽略了它们)在该字段上,它为某些值返回 selection 记录,selection 是正确的,对于其他值是错误的。

例如:

TABLE A (there is a created_at timestamp field that isn't shown below)
id   flag        approved
1    0           Y
2    1           Y
3    10          N
4    100         Y
5    1000        Y
6    10000       Y
7    100000      Y
8    1000000     Y
9    10000000    Y
10   100000000   Y
11   1000000000  Y

现在如果我这样做:

SELECT * from tableA where approved = 'Y' AND flag & 4 ORDER BY created_at DESC

正确 returns 只是 ID 为 4 的记录。一切都很好,没问题。但是,如果我这样做:

SELECT * from tableA where approved = 'Y' AND flag & 256 ORDER BY created_at DESC

然后我得到记录 5、6 和 10 - 当我只期望记录 10 时!这不是我的代码,因为如果我 运行 在 phpMyAdmin 中进行相同的查询,我会得到相同的响应,但为什么呢?这一定是我做错了什么,但我看不到什么?

我对第二个SQL语句的理解是,select全部来自table A where approved is set to Y and bit 256 in the flag field is set.

任何人都可以提供任何想法吗?导致问题的不仅仅是标志和 256,还有其他值。

结果是正确的,例如1000在二进制中是1111101000,如果你将它与256(100000000)按位比较,你得到256(100000000),这是正确的。 10000 (10011100010000) 和 100000000 (101111101011110000100000000) 相同。

标志字段的值可能为 0、1、2、4、8、16、32 等

您可以对整数列执行按位运算,但您仍然需要将它们存储为十进制值。

要将小数 2 存储在整数列存储 2,而不是 10。您可能想改用 bit 列类型。

无论哪种方式,您都可以使用 b'value' 符号来编写值,如果这样对您来说更容易的话。

INSERT INTO tablea (id, flag, approved)
VALUES (1, b'0', 'Y'), (2, b'1', 'Y'), (3, b'10', 'N')