有谁能帮助我理解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的所有数据类型。
2条答案
按热度按时间zhte4eai1#
问题似乎是,价值观
b'11..11'
在where子句中SIGNED BIGINT
哪个是-1
并与表中的值进行比较,该值被认为是UNSIGNED BIGINT
哪个是18446744073709551615
. 当第一个64位是1
. 这是一个bug或设计缺陷,因为如果insert语句中使用了相同的表达式(至少在这种情况下),我希望where子句中的表达式与行匹配。一种解决方法是将值
UNSIGNED
:或者(如果应用程序语言支持)将其转换为
long uint
或者decimal
: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