正确的存储位数组的方法

时间:2014-02-24 18:19:59

标签: mysql binary

我正在开发一个需要存储类似

的项目
 101110101010100011010101001

进入数据库。它不是文件或存档:它只是一个小数组,我认为将它存储到varchar列是浪费空间/性能。

我搜索了BLOB和VARBINARY类型。但两者都允许插入一个像54563423523515453453这样的值,这不是一个完整的数组。

当然,如果我将一个像10001000这样的位数组存储到BLOB / varbinary / varchar列中,它将消耗多于一个字节,并且我希望消耗最小空间。在8位的情况下,它只需要消耗一个字节,16位两个字节,依此类推。

如果不可能,那么在这种情况下浪费最小空间的最佳方法是什么?

重要说明:数组的大小是可变的,并且在每种情况下都不能被8整除。有时我需要存储325位,其他时间为7143位......

2 个答案:

答案 0 :(得分:0)

二进制是数字的字符串表示。字符串

101110101010100011010101001

代表数字

... + 1*25 + 0*24 + 1*23 + 0*22 + 0*21 + 1*20

因此,如果要从二进制字符串转换为它所代表的数字,它可以存储在32位整数中。在Perl中,可以使用

oct('0b'.$binary)

但是你的位数可变。不是问题!只需要一次处理它们8就可以创建一个字节串放在BLOB或类似的地方。

啊,但是有一个问题。您需要添加填充以获得可被8整除的数字,这意味着您必须使用删除填充的方法。如果已知最大长度,则使用长度前缀的简单方法。例如如果您知道位数永远不会超过65,535,请对字符串的前两个字节中的位数进行编码。

pack('nB*', length($binary), $binary)

使用

还原
my ($length, $binary) = unpacked('nB*', $packed);
substr($binary, $length) = '';

答案 1 :(得分:0)

在我之前的一个项目中,我将1和0'的流转换为小数,但它们更短。我不知道这是否适用于您的项目。

另一方面,imho,你应该澄清一旦你存储了这些数据你需要做什么。搜索?相比?它可能在很大程度上取决于数据库的用途。

你可以gzip然后存储吗?这适用吗?