任何人都可以提供任何有关此处错误的见解吗?我在表中使用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它导致问题,还有其他值。
答案 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等。