将大整数从php存储到mysql的最节省空间的方法?

将大整数从php存储到mysql的最节省空间的方法?,php,mysql,types,space-efficiency,Php,Mysql,Types,Space Efficiency,我正在处理长度超过128位的整数。它们用于存储一大组标志,我不需要对它们进行任何奇怪的计算,因此我可以将其视为php中的字符串来绕过php_INT_MAX限制 我想我们应该将这些数字存储在mysql的二进制列中。该列需要4-16个字节来保存数字 我的理解是php中的二进制列是一个二进制字符串,这是否意味着我不使用a-z作为字符集的一部分会浪费空间?我应该使用不同类型的列吗?我是否需要在php中使用base_convert来充分利用字符集 如何将php中128位整数的字符串表示形式最有效地存储到p

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

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

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

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


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

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


一如既往,这取决于您拥有多少数据。如果你谈论的是几千个数字,你不必担心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..')。

您会使用MySQL对该值执行计算吗?如果不是,您可以使用varchar(128),我可以使用varchar(128),但这将占用比我需要的更多的空间,因为每个十进制数字将占用8位。我想把它纯粹地存储为二进制数据,以便最大限度地利用空间。出于好奇,为什么首先需要节省空间?如果您设法填充一个TB大小的磁盘,您将有其他问题需要担心,这不是空间利用率。@N.B.同样的原因,您不会使用文本列存储邮政编码。为什么您会选择使用超出必要空间的空间?要做到这一点并不复杂,我知道这是可能的,找到做某事的最佳方式是一次很好的学习经历。这不仅仅是因为使用了超出必要的空间,而是因为使用了支持我永远不会使用的字符的字符集而浪费了空间。@Matthew-存储引擎的工作效率不如你想象的那么高,它们有其内在原因-底线是,你可能得不到你认为会得到的东西。我不会选择使用更多的空间,我会选择不担心空间需求,这完全是另一回事。我永远不需要十进制表示。当我检查标志时,我可以使用子字符串,一次最多只需要4个字节,所以在十六进制中使用它是可以的。因此,如果我从php插入mysql,我需要以十六进制格式发送数据,这将在mysql中正确存储数据?十六进制可能是最容易处理的,是的。用一个例子更新答案。完美,正是我想要的。请注意,对于发现此问题的其他人,插入十六进制的另一种方法是在带引号的十六进制值前面加上“x”:
insert into binary_测试集int128=x'123456789ABCDEF'