在PHP 開發中,我們經常會遇到需要從MySQL 數據庫中讀取二進制數據的情況。特別是當數據庫中存儲了二進製字段(如BINARY 、 VARBINARY或BIT類型)時,如何正確地將這些數據轉換為十進制數值,就成了一個比較常見的問題。 PHP 提供了bindec函數用於將二進製字符串轉換為十進制整數,但直接使用時往往會遇到一些坑。
本文將詳細講解如何正確使用bindec函數處理從MySQL 中取出的二進製字段數據。
假設數據庫有這樣一個字段定義:
CREATE TABLE example (
id INT PRIMARY KEY,
bin_data BINARY(4)
);
往裡存入二進制數據:
INSERT INTO example (id, bin_data) VALUES (1, 0b1011);
在PHP 中通過PDO 或mysqli 查詢時, bin_data字段會以字符串形式返回,但這時的字符串是二進制內容,不是文本“1011”,也不是“11”,而是對應的字節流。
例如,取出後可能是"\x0B\x00\x00\x00"這樣的原始字節,直接調用bindec結果不正確。
bindec函數的參數應當是類似"1011"這樣的字符串。如果直接給它二進製字節流,它並不會解析字節值,而是按字符解釋,導致錯誤結果。
利用PHP 的內置函數逐字節轉換為“0”和“1”的字符串,再用bindec解析。
示例代碼:
<?php
// 假設從 MySQL 取出的二進製字段
$binaryData = "\x0B"; // 十進制11,對應二進制1011
// 將字節流轉換為二進製字符串
function binaryToBitString(string $binary): string {
$bitString = '';
for ($i = 0; $i < strlen($binary); $i++) {
// ord() 獲取字符的 ASCII 碼,再轉成8位二進製字符串
$bitString .= str_pad(decbin(ord($binary[$i])), 8, '0', STR_PAD_LEFT);
}
return $bitString;
}
$bitString = binaryToBitString($binaryData);
echo "Bit string: " . $bitString . "\n";
// 使用 bindec 转换为十進制数
$decimalValue = bindec($bitString);
echo "Decimal value: " . $decimalValue . "\n";
?>
輸出結果:
Bit string: 00001011
Decimal value: 11
這樣就能正確地把從MySQL 取出的二進制數據轉換成十進制數字。
如果字段是BIT 類型,可以在查詢時用MySQL 函數轉換為十進制數,例如:
SELECT id, BIN(bin_data) AS bin_str FROM example;
或者直接轉換為整數:
SELECT id, CONV(HEX(bin_data), 16, 10) AS decimal_value FROM example;
這樣在PHP 端直接獲取到的就是字符串形式的二進製或十進制,避免二進製字節流的複雜處理。
bindec函數只能處理“0”和“1”組成的二進製字符串,不支持二進製字節流。
從MySQL 取出的二進製字段,通常是字節流,需要先轉換為二進製字符串才能用bindec 。
可以自己寫函數逐字節轉換,也可以在SQL 查詢時用函數預處理。
根據實際情況選擇合適的處理方案,避免二進制數據誤解析。