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

标签 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 列?

最佳答案

假设您将使用 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..')。

关于php - 将大整数从 php 存储到 mysql 的最节省空间的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775983/

相关文章:

mysql - 带有空字段 (null) 且没有结果的 SQL OUTER JOIN

mysql - 如何找到数字范围内的差距?

typescript - 如何定义一个类型,即从字符串中排除 'a' 的类型?

types - 从函数返回泛型而在rust中没有泛型参数

arrays - 类型安全的矩形多维数组类型

php - n 周期内移动/滚动标准差

php - 如何使sql查询动态化?

php - 使用 imagemagick 更快地检测图像中几个最亮点的方法?

php - 使用 Ajax 的异步 PHP 查询?

php - 如何在codeigniter中创建自定义error_php文件?