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

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

Ответов (9)

Решение

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

Основной ответ - в BLOB домене типа данных / атрибута. BLOB - это сокращение от Binary Large Object, и этот тип данных столбца предназначен для обработки двоичных данных.

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

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

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

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 <[email protected]>
    // 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>

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

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

The question also arises how to get the data into the BLOB. You can put the data in an INSERT statement, as the PHP example shows (although you should use mysql_real_escape_string instead of addslashes). If the file exists on the database server, you can also use MySQL's LOAD_FILE

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

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

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

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

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

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

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

Идея взята отсюда .

Когда мне нужно сохранить двоичные данные, я всегда использую VARBINARY формат, представленный d0nut в одном из предыдущих ответов.

Вы можете найти документацию на веб-сайте MySQL в задокументированной теме: 12.4.2 Типы BINARY и VARBINARY .

Если вы спрашиваете, в чем заключаются преимущества, прочтите вопрос: почему-varbinary-вместо-of-varchar .