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

时间:2015-01-21 14:29:50

标签: php mysql bit-manipulation bitwise-operators

任何人都可以提供任何有关此处错误的见解吗?我在表中使用BIGINT(20)字段来存储按位值(这里也有其他字段,但为了简单起见,我们在SO上忽略它们)当在该字段上完成SELECT语句时,它是为某些值返回选择的记录,选择是正确的,对其他人来说是错误的。

例如:

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

它正确地返回ID为4的记录。一切都很好,没有问题。但是,如果我这样做:

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

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

我对第二个SQL语句的理解是,从表A中选择all,其中approved被设置为Y并且标志字段中的位256被设置。

任何人都可以提出任何想法吗?它不仅仅是旗帜和旗帜。 256它导致问题,还有其他值。

2 个答案:

答案 0 :(得分:1)

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

将十进制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')

答案 1 :(得分:0)

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

标志字段应该具有值0,1,2,4,8,16,32等。