Mysql没有正确插入二进制数据

时间:2013-08-01 12:23:05

标签: php mysql bit

我正在进行数据压缩,出于某种原因,我只需要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中插入值列是00110000

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

这是保存值的另一个函数

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

2 个答案:

答案 0 :(得分:2)

语法"INSERT INTO n (reading) VALUES (b'".$value."')"应该有效,前提是$value已正确编码为'0''1'的字符串。

编辑:我注意到您在插入数据时没有提供任何“序列号”。但是,请记住,如果不使用正确的ORDER BY子句,则无法检索 bytes 首先输入的顺序。也许你认为你读的是“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列时,您将获得签名结果(即:存储 255 将读取 -1

您可以将签名的 10基本整数或二进制形式(带可选填充)检索数据:

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

至于我自己,我更喜欢TINYINT UNSIGNED。这是一个8位类型,支持相同的语法(< 10-base digit> b'xxxxxxxx') - 但会接受{{ 1}}说明符:

UNSIGNED

您可以将无符号 10基本整数或二进制形式(带可选填充)检索数据:

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

请参阅http://sqlfiddle.com/#!2/4ff44/6以试验它们。

答案 1 :(得分:0)

我认为这可能对你有帮助, 使用php将二进制数据插入mysql 模式

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