2014-02-24 60 views
0

我的工作,需要像正確的方式來存儲一個比特陣列

101110101010100011010101001 

存儲的東西到數據庫中的一個項目。這不是一個文件或存檔:它只是一個位數組,我認爲將它存儲到一個varchar列是浪費空間/性能。

我搜索了關於BLOB和VARBINARY類型。但是兩者都允許插入像54563423523515453453這樣的值,這不完全是一個位數組。

當然,如果我將一個像10001000這樣的位數組存儲到BLOB/varbinary/varchar列中,它將消耗多於一個字節,並且我希望佔用最小空間。在8位的情況下,它只需要消耗一個字節,兩個字節的16位等等。

如果這是不可能的,那麼在這種情況下浪費最小空間的最佳方法是什麼?

重要注意事項:數組的大小是可變的,在任何情況下都不能被8整除。有時我需要存儲325位,其他時間是7143位....

回答

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) = ''; 
0

恢復在我以前的一個項目,我轉換的1和0' 的流小數,但他們更短。我不知道這是否適用於您的項目。

另一方面,你應該明確一旦你存儲了這些數據你需要做什麼。搜索?比較?它很大程度上取決於數據庫的用途。

你可以gzip然後存儲它嗎?這適用嗎?

+0

感謝您的回答。解釋起來有點複雜,但在簡歷中,我的代碼中有一個bool [],我只想存儲,之後按原樣選擇它。 – Guilherme

+0

如果只關心存儲空間,你應該使用一些壓縮方法並將它壓縮成imho –

相關問題