mysql中位(64)列的奇怪行为

qoefvg9y  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(249)

有谁能帮助我理解mysql(5.7.19)中位(64)列的以下问题吗。
这个简单的示例运行良好,并从临时表返回记录:

CREATE TEMPORARY TABLE test (v bit(64));
INSERT INTO test values (b'111');
SELECT * FROM test WHERE v = b'111';
-- Returns the record as expected

当使用列的所有64位时,它将不再工作:

CREATE TEMPORARY TABLE test (v bit(64));
INSERT INTO test values (b'1111111111111111111111111111111111111111111111111111111111111111');
SELECT * FROM test WHERE v = b'1111111111111111111111111111111111111111111111111111111111111111';
-- Does NOT return the record

只有在使用64位的值时才会发生这种情况。但我希望这是可能的。
有人能给我解释一下吗?
请不要回复我不要使用位列。我正在开发一个数据库工具,它应该能够处理mysql的所有数据类型。

zhte4eai

zhte4eai1#

问题似乎是,价值观 b'11..11' 在where子句中 SIGNED BIGINT 哪个是 -1 并与表中的值进行比较,该值被认为是 UNSIGNED BIGINT 哪个是 18446744073709551615 . 当第一个64位是 1 . 这是一个bug或设计缺陷,因为如果insert语句中使用了相同的表达式(至少在这种情况下),我希望where子句中的表达式与行匹配。
一种解决方法是将值 UNSIGNED :

SELECT * 
FROM test
WHERE v = CAST(b'1111111111111111111111111111111111111111111111111111111111111111' as UNSIGNED);

或者(如果应用程序语言支持)将其转换为 long uint 或者 decimal :

SELECT * FROM test WHERE v = 18446744073709551615;
zbdgwd5y

zbdgwd5y2#

位以二进制形式返回,所以要显示它们,可以加0,或者使用诸如hex、oct或bin之类的函数来转换它们https://mariadb.com/kb/en/library/bit/ 或结果集中的位值作为二进制值返回,这可能无法很好地显示。要将位值转换为可打印形式,请在数字上下文中使用它,或使用转换函数,如bin()或hex()。转换后的值中不显示高位0位数。https://dev.mysql.com/doc/refman/8.0/en/bit-value-literals.html

相关问题