1

最大 128 ビット長の整数を扱っています。これらはフラグの大規模なセットを格納するために使用されており、変な計算を行う必要がないため、php で文字列のように処理して PHP_INT_MAX の制限を回避できます。

これらの数値をmysqlのBINARY列に保存したいと思います。列には、数値を保持するために 4 ~ 16 バイトが必要です。

私の理解では、php の BINARY 列はバイナリ文字列です。これは、文字セットの一部として az を使用しないことでスペースを浪費するということですか? 別のタイプの列を使用する必要がありますか? 文字セットを最大限に活用するには、php で base_convert する必要がありますか?

PHPの128ビット整数の文字列表現をPHPの128ビット列に最も効率的に格納するにはどうすればよいですか?

また、保存している整数の約半分が 4 バイトしか必要としない場合、VARBINARY 列を使用したほうがよいでしょうか?

4

2 に答える 2

2

128 ビットの全範囲を使用すると仮定すると、各数値は同じように可能性が高く、数値ごとに 128/8 = 16 文字を格納するのが最もスペース効率が高くなります。

ただし、このバイナリ表現と PHP 文字列との間の変換には少し問題があります。バイナリ文字列を基数 16 の数値にデコードするには、次を使用できますunpack

$numberInHex = unpack("H*", $binaryData);

出力を 10 進数に、または 10 進数から変換する必要がある場合は、gmp または bc を使用する必要があります。

更新:例:

> create table binary_test ( int128 binary(16) );
> insert into binary_test set int128 = 0x11223344556677889900112233445566;
> select hex(int128) from binary_test;
+----------------------------------+
| hex(int128)                      |
+----------------------------------+
| 11223344556677889900112233445566 |
+----------------------------------+

0x1122... の代わりに unhex('1122..') を使用することもできます。

于 2013-04-02T23:26:48.840 に答える
0

整数をバイナリ形式 (例: 45 -> 00101101(bin)、0x2D(hex)) で保存すると、文字ではなくビットを使用するため、スペースが無駄になりません。

いつものように、それはあなたが持っているデータの量に依存します. 数千の数字について話している場合は、varbinary について心配する必要はありません。一方、数百万または数十億のレコードがある場合は、いくつかの最適化を行う価値があります。

于 2013-04-02T23:09:52.347 に答える