谁能提供任何关于这里问题的见解? 我在表中使用 BIGINT(20) 字段来存储按位值(这里还有其他字段,但为了简单起见,我忽略了它们)当在该字段上完成 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中选择所有,其中批准设置为Y,并在标志字段中设置了位256。
谁能提出任何想法? 它不仅仅是标志和256导致问题,还有其他值。
可以对整数列执行按位运算,但仍需要将它们存储为十进制值。
要在整数列中存储十进制 2,请存储 2
,而不是 10
。您可能希望改用位列类型。
无论哪种方式,如果对您来说更容易,您可以使用b'value'
表示法来编写值。
INSERT INTO tablea (id, flag, approved)
VALUES (1, b'0', 'Y'), (2, b'1', 'Y'), (3, b'10', 'N')
结果是正确的,例如 1000 在 binairy 中1111101000,如果将其与 256 (1000000000) 进行两次比较,则得到 256 (100000000),这是真的。10000 (10011100010000) 和 100000000 (101111101011110000100000000) 也是如此。
标志字段的概率应具有值 0、1、2、4、8、16、32 等。