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')
任何人都可以深入了解这里出了什么问题吗?当 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')