我正在使用Apache XAMPP服务器。我需要对大整数执行逻辑运算,例如5(101)& 2(010)= 0(000)。不幸的是,我的大整数超过了MySQL BIGINT的最大值,即18446744073709551615.
我使用的数字的一个示例是455214730926009756012878233,因此我使用VARCHAR代替BIGINT,我需要对此VARCHAR执行逻辑运算。 我试过像
这样的东西SELECT number FROM table WHERE number & 12 = 12
它不会返回正确的行。 当我尝试类似
的时候SELECT number FROM table WHERE number & 455214730926009756012878233 = 455214730926009756012878233
它没有给我任何行,而它应该返回数字为'455214730926009756012878233'的行
那么,在MySQL中对这样的真实大整数进行逻辑运算的正确方法是什么?
答案 0 :(得分:0)
问题不是关于逻辑运算符(那些处理布尔值),而是关于按位运算符。
在MySQL v5.7中,按位运算符为restricted to bigints:
目前,位函数和运算符需要BIGINT(64位整数) 参数和返回BIGINT值,因此它们的最大范围为64 位。其他类型的参数将转换为BIGINT和截断 可能会发生。
1)您可以考虑升级到v8.0,因为supports binary strings as operands为按位操作:
在MySQL 8.0中,位函数和运算符允许二进制字符串类型参数(BINARY,VARBINARY和BLOB类型)并返回类似的值,这使它们能够获取参数并生成大于64位的返回值。非二进制字符串参数将转换为BIGINT并按原样处理,如前所述。
但是,v8.0目前仍处于开发阶段,因此对于生产数据库来说这可能是一个冒险的举动。
2)您可以尝试将大数字拆分为多个64位数字,对每个部分执行操作。为了有效地工作,我将数字存储为十六进制格式而不是标准十进制格式,因为您可以通过从字符串中读取固定数量的字符(16)来获取各个部分,并将其用于转换。
select * from yourtable
where left(`fieldname`,16) & left(X'1788b7802c8530419999999',16)=left(X'1788b7802c8530419999999')
and right(fieldname,char_length(fieldname)-16) & right(X'1788b7802c8530419999999',char_length(X'1788b7802c8530419999999')-16)=right(X'1788b7802c8530419999999',char_length(X'1788b7802c8530419999999')-16)
答案 1 :(得分:0)
在VARCHAR
上没有内置任何二进制操作。由于VARCHAR
是一种文字类型,我认为无论如何都不合适。
更好地将数字存储在数字类型中,例如DECIMAL(39,0)
。对于按位运算,将其拆分为两个64位部分:
select
(455214730926009756012878231 DIV 18446744073709551616) as highbits,
(455214730926009756012878231 % 18446744073709551616) as lowbits,
(455214730926009756012878231 % 18446744073709551616) % 12
18446744073709551616是2 ^ 64。不要使用POW(2, 64)
。这个函数是错误的,导致错误的18446744073709552000(至少在MySQL 5.7.2中;我想MySQL在这里使用近似数学类型的近似数学)。