Двоичные данные в MySQL

Как хранить двоичные данные в в MySQL?

10 ответов


ответ phpguy правильный, но я думаю, что в дополнительных деталях есть много путаницы.

основной ответ в BLOB тип данных / атрибутов домена. BLOB является коротким для двоичного большого объекта, и этот тип данных столбца специфичен для обработки двоичных данных.

посмотреть соответствующая страница руководства для MySQL.


для такой таблицы:

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>

Я настоятельно рекомендую против хранение двоичных данных в реляционной базе данных. Реляционные базы данных предназначены для работы с данными фиксированного размера; вот где их производительность: помните старая статья Джоэла о том, почему базы данных так быстро? потому что для перехода от записи к другой записи требуется ровно 1 приращение указателя. Если вы добавите данные BLOB неопределенного и значительно изменяющегося размера, вы испортите производительность.

вместо этого храните файлы в файловая система и сохранение имен файлов в базе данных.


хотя вы не сказали, что вы храните, и у вас может быть отличная причина для этого, часто ответ "как ссылка на файловую систему", и фактические данные находятся в файловой системе где-то.

http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html


это зависит от данных, которые вы желаете сохранить. В приведенном выше примере используется LONGBLOB тип данных, но вы должны знать, что есть и другие двоичные форматы данных:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

у каждого свои варианты использования. Если это известная (короткая) длина (например, упакованные данные) часто раз BINARY или VARBINARY будет работать. Они имеют добавленное преимущество мочь индекс тонны на их.


хотя это не должно быть необходимо, вы можете попробовать base64 кодирование и декодирование данных. Это означает, что БД будет иметь только символы ascii. Это займет немного больше места и времени, но любая проблема, связанная с двоичными данными, будет устранена.


Если - не рекомендуется - BLOB поле существует, вы можете сохранить данные таким образом:

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

идея взята из здесь.


также возникает вопрос, Как получить данные в BLOB. Вы можете поместить данные в инструкцию INSERT, как показывает пример PHP (хотя вы должны использовать использования mysql_real_escape_string вместо addslashes). Если файл существует на сервере базы данных, вы также можете использовать MySQL LOAD_FILE


когда мне нужно хранить двоичные данные, я всегда использую , а представил byd0nut.

вы можете найти документацию на веб-сайте MySQL в документированной теме 12.4.2 двоичный и VARBINARY типы

Если вы спрашиваете, что advantagese, пожалуйста, посмотрите на вопрос почему-varbinary-вместо-varchar


гораздо лучшая реализация хранилища в available здесь. Вы столкнетесь с проблемами с реализацией Флориана.