大多数空间有效的方式来存储从php到mysql的大整数?

时间:2013-04-02 23:02:18

标签: php mysql types space-efficiency

我正在使用长度超过128位的整数。它们用于存储大量标志,我不需要对它们进行任何奇怪的数学运算,因此我可以将其视为php中的字符串,以绕过PHP_INT_MAX限制。

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

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

如何将我在php中128位整数的字符串表示最有效地存储到php中的128位列?

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

2 个答案:

答案 0 :(得分: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 ..')。

答案 1 :(得分:0)

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

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