我正在开发一个需要存储类似
的项目 101110101010100011010101001
进入数据库。它不是文件或存档:它只是一个小数组,我认为将它存储到varchar列是浪费空间/性能。
我搜索了BLOB和VARBINARY类型。但两者都允许插入一个像54563423523515453453这样的值,这不是一个完整的数组。
当然,如果我将一个像10001000这样的位数组存储到BLOB / varbinary / varchar列中,它将消耗多于一个字节,并且我希望消耗最小空间。在8位的情况下,它只需要消耗一个字节,16位两个字节,依此类推。
如果不可能,那么在这种情况下浪费最小空间的最佳方法是什么?
重要说明:数组的大小是可变的,并且在每种情况下都不能被8整除。有时我需要存储325位,其他时间为7143位......
答案 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然后存储吗?这适用吗?