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 字符串之间的转换虽然有点问题。要将二进制字符串解码为 base-16 数字,您可以使用unpack

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

如果必须将输出转换为十进制数或从十进制数转换,则必须使用 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 回答