简体   繁体   中英

Mysql not inserting binary data properly

I am working on data compression and for some reason i need only 8 bits. I am converting number by decbin() and then inserting it in the mysql, the mysql column data type BIT width is 8 bit. I used mysql_query("INSERT INTO n (reading) VALUES (b'".$value."')") and tried this one too mysql_query("INSERT INTO n (reading) VALUES (".$value.")") . Before inserting the value is fine but after insertion its not the same value, it changes the value for example before insertion it echo the value 116 then I echo its binary value 1110100 and it insert the value in mysql column is 00110000 .

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

here is the other function where it saves the value

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

The syntax "INSERT INTO n (reading) VALUES (b'".$value."')" should work provided that $value is properly encoded as a string of '0' and '1' .

EDIT: I noticed you didn't provide any "sequence number" while inserting your data. But, please remember that without using a proper ORDER BY clause, you cannot retrieve your bytes the order they where entered at first. Maybe you think you read "116" but MySQL return an other row from the table?


Here are some usage examples, First using the BIT type:

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

Please note that when retrieving BIT columns you will obtain signed result (ie: storing 255 will read -1 ).

You could retrieve your data either as signed 10-base integers or binary form (with optional padding):

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

As of myself, I would prefer the TINYINT UNSIGNED . This is an 8 bit type which support the same syntax for values (either <10-base digit> or b'xxxxxxxx' ) -- but will accept the UNSIGNED specifier:

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

You could retrieve your data either as unsigned 10-base integers or binary form (with optional padding):

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

See http://sqlfiddle.com/#!2/4ff44/6 to experiment with both of them.

i think this may help you , inserting binary data into mysql using php schema

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

create the above table before using the script

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>

usage: 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";
        }
    }
}
?>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM