3

私のテーブルには、128ビットの符号なし数値であることがわかっている列があり、base-10にvarcharとして格納されています。

"25495123833603613494099723681886"

この数値のビット フィールドはわかっているので、上位 64 ビットを使用したいと考えていますGROUP BY

私の例では、上位の 64 ビットは次のようになります。1382093432409

方法は見つかりませんでしたが、いくつかのリードを排除しました:

  • これらも64ビットであるため、 NUMERIC/に変換できませんDECIMAL
  • は base-10 で整列されていないLEFT()ため使用できません1<<64
  • CONV(N,10,16)許可しますLEFT()CONV()、64ビット精度でも機能します:(

BIGINTこの数値の上位 64 ビットを取得するにはどうすればよいGROUP BYですか?

4

1 に答える 1

2

浮動小数点演算を使用して、少なくともその方法の一部を取得できます。

MySQL は、非整数演算に倍精度浮動小数点を使用します。これにより、整数値に対して約 50 ビットの信頼できる精度が得られます。これは 64 ビットとは言えませんが、かなり近い値です。次の式を使用して、浮動小数点演算を使用して上位ビットを抽出できます。

FLOOR(n / POW(2,64))

ここnで、列の名前です。

ただし、50 を超えるビットが必要な場合、このアプローチは無駄になります。倍精度浮動小数点数でさえ、全体を表すのに十分な有効ビットがなく、減算を使用してそれ以上取得しようとすると、キャンセルが原因で失敗します。(余分なビットは、文字列が数値に変換されるとすぐに失われます。まったく別のことをしない限り、元に戻すことはできません。)

于 2013-10-24T07:05:56.923 に答える