Php MySQL将不正确的记录返回到按位选择

Php MySQL将不正确的记录返回到按位选择,php,mysql,bit-manipulation,bitwise-operators,Php,Mysql,Bit Manipulation,Bitwise Operators,有谁能洞察这里到底出了什么问题?我在表中使用一个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

有谁能洞察这里到底出了什么问题?我在表中使用一个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中选择all,其中approved设置为Y,flag字段中的位256设置为256


有人能提供一些想法吗?问题不仅仅是由标志&256引起的,还有其他值。

结果是正确的,例如,二进制中1000是11111 01000,如果将其与256(100000000)进行位比较,则得到256(100000000),这是真的。10000(10011100010000)和100000000(101111101011100000000)的情况相同


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

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

要在整数列中存储十进制2,请存储
2
,而不是
10
。您可能希望改用列类型

无论哪种方式,如果您更方便的话,您都可以使用
b'value'
notation来编写值

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

“批准”还是“确认”?您还引用了表名和列名,应该只使用反勾号。引号用于值。不要将表和列视为字符串值。阅读此
BIGINT
不是字段。在BIGINT中存储
10
是十进制10,而不是2。@JayBlanchard Hi-Jay,对不起,我是说批准。啊,那可能是我从Laravel数据库日志中复制的。但是,没有引号或反勾号对结果没有影响。@MarcusAdams我确实想到过,但它建议BIGINTs用于bitwiseBart,谢谢。事实上它不是——上面显示的1000实际上是8——正如马库斯所评论的,我犯了存储位而不是十进制的错误,即1000而不是8。