最节省空间的方式来存储大整数从php到mysql


Most space efficient way to store large integer from php to mysql?

我正在处理最长128位的整数。它们被用来存储大量的标志,我不需要对它们做任何奇怪的数学运算,所以我可以把它当作php中的字符串来处理,以绕过PHP_INT_MAX限制。

我想把这些数字存储在mysql的二进制列中。该列将需要4-16字节来保存数字。

我的理解是,二进制列在php是一个二进制字符串,这是否意味着我将浪费空间不使用a-z作为字符集的一部分?我应该使用不同类型的列吗?我需要base_convert在php中得到字符集的充分利用吗?

我如何得到我的字符串表示的一个128位整数在php存储到一个128位列在php最有效?

另外,如果我存储的大约一半的整数只需要4个字节,那么使用VARBINARY列会更好吗?

假设您将使用128位的全部范围,每个数字的可能性相等,那么您可以使用的最有效的空间效率是每个数字存储128/8 = 16个字符。

这种二进制表示和PHP字符串之间的转换有点问题。要将二进制字符串解码为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..')

如果您将整数保存为二进制格式(例如:45 -> 00101101(bin), 0x2D(十六进制)),您将不会浪费任何空间,因为您将不使用字符而是使用位。

一如既往,这取决于你有多少数据。如果您讨论的是几千个数字,则不需要担心varbinary。另一方面,如果您有数百万/数十亿条记录,那么值得做一些优化。