2013-08-01 39 views
3

我正在進行數據壓縮,出於某種原因,我只需要8位數據。 我通過decbin()轉換數字,然後將它插入到mysql中,mysql列數據類型的BIT寬度是8位。我使用mysql_query("INSERT INTO n (reading) VALUES (b'".$value."')"),並嘗試這一個mysql_query("INSERT INTO n (reading) VALUES (".$value.")")。在插入值之前沒有問題,但在插入值不同之後,例如在插入之前它將值更改爲回顯值116,然後我回顯其二進制值1110100,並在mysql列中插入值爲00110000Mysql沒有正確插入二進制數據

function delta($reading){ 
    global $flag; 
    $delta = $flag - $reading; 
    saveDelta(decbin($delta));  
} 

這裏是其它功能,其中它保存的價值

function saveDelta($dif) { 
    mysql_query("INSERT INTO n (reading) VALUES (".$dif.")");  
} 
+0

你能表現出更多的代碼?例如,你如何(重新)從數據庫讀取數據。對於我所看到的,你沒有意願檢索他們在第一次輸入的順序的值... –

回答

2

"INSERT INTO n (reading) VALUES (b'".$value."')"應該工作提供$value的語法正確編碼爲'0''1'的字符串。

編輯:我注意到你在插入數據時沒有提供任何「序列號」。但是,請記住,如果沒有使用適當的ORDER BY子句,則無法檢索您的字節它們首先輸入的順序。也許你認爲你閱讀「116」,但MySQL從表中返回另一行?


下面是一些用法示例,首先使用BIT類型:

CREATE TABLE b (value BIT(8)); 
INSERT INTO b VALUES (0),(1), (255); 
INSERT INTO b VALUES (b'00000000'),(b'00000001'), (b'11111111'); 

請注意,檢索BIT列時,你將獲得簽署結果(即:存儲會讀-1)。

你可以檢索您的數據無論是作爲簽署 10基整數或二進制形式(帶有可選的填充):

SELECT value FROM b; 
SELECT BIN(value) FROM b; 
SELECT LPAD(BIN(value), 8, '0') FROM b; 

至於我自己,我寧願TINYINT UNSIGNED。這是一個8位的類型支持相同語法值(無論是< 10鹼基位>b'xxxxxxxx」) - 但將接受UNSIGNED說明符:

CREATE TABLE t (value TINYINT UNSIGNED); 
INSERT INTO t VALUES (0),(1),(255); 
INSERT INTO t VALUES (b'00000000'),(b'00000001'), (b'11111111'); 

你可以檢索數據既可以作爲無符號基整數或二進制形式(帶有可選的填充):

SELECT value FROM t; 
SELECT BIN(value) FROM t; 
SELECT LPAD(BIN(value), 8, '0') FROM t; 

http://sqlfiddle.com/#!2/4ff44/6來試驗它們。

+0

我作了 '表CREATE TABLE b(值BIT(8));' 插入的值如 'INSERT INTO b值(b'00000000' );' 和類似 'INSERT INTO b值(00000000);' 和當我嘗試
'SELECT LPAD(BIN(讀取))選自N;' 它給出空白的結果,當我嘗試 'SELECT BIN(閱讀)FROM n;'或'SELECT reading FROM n;' 它給了我結果#id#7,id#8,id#9 ..... ' – Waqas

+0

你知道它爲什麼這樣做嗎? – Waqas

0

我想這可能會幫助你, 插入二進制數據到MySQL的使用PHP 模式

CREATE TABLE `mydata` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`data` LONGBLOB NOT NULL, 
`fname` VARCHAR(255) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE = InnoDB 

使用腳本

upload_file.php

<?php 
if($_FILES['myfile']['tmp_name']!="") 
{ 
    if(mysql_connect("localhost","root","")) 
    { 
     if(mysql_select_db("mydb")) 
     { 
      $fname=$_FILES['myfile']['name']; 
      $tname = $_FILES['myfile']['tmp_name']; 
      $fsize = $_FILES['myfile']['size']; 
      $data=file_get_contents($tname); 
      //to escape all binary data which can make mysql mad 
      $data = mysql_real_escape_string($data); 
      if(mysql_query("Insert into mydata (data,fname) values('$data','$fname')")) 
      { 
       echo "File inserted successfully"; 
      } 
      else 
      { 
       echo "Error occured ".mysql_error(); 
      } 
      mysql_close(); 
     } 
    } 
} 
    ?> 
    <form action="" method="post" enctype="multipart/form-data"> 
    <input type="file" name="myfile"> 
    <input type="submit" value="UPLOAD"> 
    </form> 

之前創建上表用法:upload_file.php

download_file.php

<?php 
if(mysql_connect("localhost","root","")) 
{ 
    if(mysql_select_db("mydb")) 
    { 
     $id = (int)$_GET['id']; 
     $result=mysql_query("Select * from mydata where id = {$id}"); 
     if($row=mysql_fetch_array($result)) 
     { 
      Header("Content-type: application/octet-stream"); 
      Header("Content-Disposition: inline; filename={$row['fname']}"); 
      echo ($row['data']); 
     } 
     else 
     { 
      echo "File doesn't exist with above id"; 
     } 
    } 
} 
?> 
+0

正如我上面提到的,我需要正好8位,我不能使用BLOB它殺死了目標。那就是爲什麼我使用BIT數據類型。 – Waqas