MySQL中大整数的逻辑运算

时间:2017-06-07 08:14:53

标签: mysql sql biginteger logical-operators varchar

我正在使用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中对这样的真实大整数进行逻辑运算的正确方法是什么?

2 个答案:

答案 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在这里使用近似数学类型的近似数学)。