Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的二进制数据_Mysql_Database_Binary Data_Data Storage - Fatal编程技术网

MySQL中的二进制数据

MySQL中的二进制数据,mysql,database,binary-data,data-storage,Mysql,Database,Binary Data,Data Storage,如何在中存储二进制数据?对于这样的表: CREATE TABLE binary_data ( id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY, description CHAR(50), bin_data LONGBLOB, filename CHAR(50), filesize CHAR(50), filetype CHAR(50) ); 下面是一个PHP示例: <?php // sto

如何在中存储二进制数据?

对于这样的表:

CREATE TABLE binary_data (
    id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    description CHAR(50),
    bin_data LONGBLOB,
    filename CHAR(50),
    filesize CHAR(50),
    filetype CHAR(50)
);
下面是一个PHP示例:

<?php
    // store.php3 - by Florian Dittmer <dittmer@gmx.net>
    // Example php script to demonstrate the storing of binary files into
    // an sql database. More information can be found at http://www.phpbuilder.com/
?>

<html>
    <head><title>Store binary data into SQL Database</title></head>

    <body>
        <?php
            // Code that will be executed if the form has been submitted:

            if ($submit) {
                // Connect to the database (you may have to adjust
                // the hostname, username or password).

                mysql_connect("localhost", "root", "password");
                mysql_select_db("binary_data");

                $data = mysql_real_escape_string(fread(fopen($form_data, "r"), filesize($form_data)));

                $result = mysql_query("INSERT INTO binary_data (description, bin_data, filename, filesize, filetype) ".
                                    "VALUES ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')");

                $id= mysql_insert_id();
                print "<p>This file has the following Database ID: <b>$id</b>";

                mysql_close();
            } else {

                // else show the form to submit new data:
        ?>
        <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
            File Description:<br>
            <input type="text" name="form_description"  size="40">
            <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
            <br>File to upload/store in database:<br>
            <input type="file" name="form_data"  size="40">
            <p><input type="submit" name="submit" value="submit">
        </form>

        <?php
            }
        ?>
    </body>
</html>

将二进制数据存储到SQL数据库中

phpguy的回答是正确的,但我认为在附加细节中存在很多混乱

基本答案是在
BLOB
数据类型/属性域中BLOB是二进制大对象的缩写,该列数据类型特定于处理二进制数据


请参阅。

虽然您没有说明要存储什么,而且您可能有很好的理由这样做,但答案通常是“作为文件系统引用”,而实际数据位于文件系统的某个位置


问题还在于如何将数据放入BLOB中。您可以将数据放在INSERT语句中,如PHP示例所示(尽管您应该使用INSERT而不是addslashes)。如果该文件存在于数据库服务器上,您也可以使用MySQL的

,虽然这不是必需的,但您可以尝试对数据进行编码和解码。这意味着数据库将只有ascii字符。这将占用更多的空间和时间,但与二进制数据有关的任何问题都将被消除。

我强烈建议不要将二进制数据存储在关系数据库中。关系数据库设计用于处理固定大小的数据;这就是他们的性能优势所在:还记得为什么数据库如此之快吗?因为从一个记录移动到另一个记录只需要1个指针增量。如果添加未定义且大小变化很大的BLOB数据,则会破坏性能


而是将文件存储在文件系统中,并将文件名存储在数据库中

这取决于您希望存储的数据。上面的示例使用了
LONGBLOB
数据类型,但您应该知道还有其他二进制数据类型:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB

VARBINARY

BINARY

每个都有自己的用例。如果是已知(短)长度(例如压缩数据),
BINARY
VARBINARY
将在大部分时间工作。它们还有一个额外的好处,就是能够对它们进行索引。

如果存在--BLOB字段,则可以通过以下方式保存数据:

mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");

想法来源于。

当我需要存储二进制数据时,我总是使用前面一个答案中介绍的
VARBINARY
格式

您可以在MySQL网站的文档主题下找到文档:


如果您想问什么是优势,请阅读以下问题:。

此代码看起来像PHP3(或者可能是4),它启用了register\u globals。您不想运行这段代码,而且它也无法在半最新的PHP安装(版本5)上运行。-1用于addslashes(),其中需要mysql\u real\u escape\u string()。我们可以停止给人们提供带有SQL注入漏洞的代码吗?(不,addslashes()还不够好。)我没有投反对票,但这可能是因为他暗示你永远不应该这样做,而不是说大多数时候这是个坏主意。我大体上同意他的意见,但不是100%都同意。除了性能之外,还可以考虑其他因素。例如,我现在正在做一些性能根本不重要的事情。其他因素,如集中化、简单性和备份,意味着在这种情况下,在数据库中存储是有意义的。另一个常见的原因是复制。另一方面,在db中存储数据是独立于操作系统的,这对于奇怪的文件名很好。db可以存储具有相同文件名的多个文件,而操作系统不能。它没有读/写/删除问题。它不需要额外的备份系统。而且,这不是公开的。所以有时候发展很快。顺便说一句,没有人强迫你将所有内容都存储在同一个数据库中,最终都会存储在磁盘上。@AlexWeinstein,你把二进制数据和固定宽度的数据混淆了。二进制数据也可以是固定宽度的。固定宽度数据并不适用于所有情况。事实上,在许多情况下,您都可以从可变宽度的数据中获益:阅读@Pacerier的最后一段,二进制(16)是固定存储的。至于BLOB:BLOB有一个固定宽度的指针,指向存储在表外的数据。这与内联存储的varchar或varbinary不同。搜索blob需要一些额外的步骤,但将其从WHERE子句中删除就可以了。我还认为在文件系统中存储文件是非常不完整的,不可移植的。如果文件被删除了怎么办?@never:你特别想要什么信息?你觉得和答案中缺少什么?因为我不能发布答案,我想我会在这里发布。如果您想存储某些二进制数据,您可以创建一个表,设置一个PHP文件或脚本来存储它,然后在表中写入某些二进制数据,让脚本完成它的工作。说真的,我真的不知道如何在其他语言中使用PHP…那个链接说,MySQL\u real\u escape\u字符串不受欢迎。