MySQL大整数的逻辑操作



我正在使用apache xampp服务器。我需要在大整数上执行逻辑操作,例如5(101(&2(010(= 0(000(。不幸的是,我的大整数超过了MySQL Bigint的最大值,即184467444073709551615。

我使用的数字的一个示例是455214730926009756012878233,因此我需要对此Varchar进行逻辑操作,而不是BigInt,而不是Bigint。我尝试了

之类的东西
SELECT number FROM table WHERE number & 12 = 12

它不会返回正确的行。当我尝试

之类的东西时
SELECT number FROM table WHERE number &  455214730926009756012878233 = 455214730926009756012878233

它没有给我排,而它应该返回该数字为'455214730926009756012878233'

的行

那么,在MySQL中这样的真正大整数进行逻辑操作的正确方法是什么?

问题不是关于逻辑运算符(那些处理布尔值(,而是关于位运算符。

MySQL v5.7 Bitwise Operator仅限于Bigint:

当前,位功能和操作员需要bigint(64位整数( 争论和返回bigint值,因此它们的最大范围为64 位。其他类型的参数转换为bigint和截断 可能发生。

1(您可以考虑升级到v8.0,因为它支持二进制字符串作为操作数的二进制字符串:

在MySQL 8.0中,位功能和运算符允许二进制字符串类型参数(二进制,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)

内置没有内置可以在VARCHAR上进行二进制操作。而且由于VARCHAR是一种文本类型,我无论如何都不认为它是合适的。

最好将数字存储在数字类型中,例如DECIMAL(39,0)。对于位操作,将其分为两个64位零件:

select 
  (455214730926009756012878231 DIV 18446744073709551616) as highbits,
  (455214730926009756012878231 %   18446744073709551616) as lowbits,
  (455214730926009756012878231 %   18446744073709551616) % 12

18446744073709551616 IS 2^64。不要使用POW(2, 64)。此功能是错误的,导致不正确的184446744073709552000(至少在MySQL 5.7.2中;我想MySQL在此处使用近似数学,而在此处使用大约数据类型(。

相关内容

  • 没有找到相关文章

最新更新