MySQLのバイナリデータ[終了]


186

MySQLにバイナリデータを保存するにはどうすればよいですか?


1

2
@Nevir:具体的にどのような情報を求めていますか?@phpguy@Mat 答えに欠けているものは何だと思いますか?
eggyal

申し訳ありませんが、これを報奨するつもりはありませんでしたが(SOのUIバグに遭遇しました)、報奨金を削除することはできません
Nevir

バウンティを削除できるはずです
Akshay Giri FR

回答:


138

phpguyの答えは正しいですが、追加の詳細については多くの混乱があると思います。

基本的な答えは、BLOBデータ型/属性ドメインです。BLOBはBinary Large Objectの略で、その列のデータ型はバイナリデータの処理に固有です。

MySQLの関連マニュアルページを参照してください


57

このようなテーブルの場合:

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>

9
このコードは、register_globalsが有効になっているPHP3(またはおそらく4)のように見えます。このコードを実行する必要はありません。また、準最新のPHPインストール(バージョン5)でも機能しません。
ティル

26
mysql_real_escape_string()が必要なaddlashes()の場合は-1。SQLインジェクションの脆弱性が含まれるコードの提供をやめてもらえますか?(いいえ、addslashes()は十分ではありません。)
chaos

40

リレーショナルデータベースにバイナリデータを保存しないことを強くお勧めます。リレーショナルデータベースは、固定サイズのデータ​​を処理するように設計されています。そこでパフォーマンスの強みがあります。なぜデータベースが非常に高速であるかについてのJoelの古い記事を思い出してください。レコードから別のレコードに移動するには、正確に1ポインタの増分が必要だからです。未定義でサイズが大きく異なるBLOBデータを追加すると、パフォーマンスが台無しになります。

代わりに、ファイルをファイルシステムに格納し、ファイル名をデータベースに格納します。


11
私は反対票を投じなかったが、それはほとんどの場合悪い考えであると言うのとは対照的に、決してあなたがそれをすべきではないことを彼が示唆しているためかもしれない。私は一般的に彼に同意しますが、100%のケースでは同意しません。パフォーマンス以外の考慮事項がある場合があります。たとえば、パフォーマンスがまったく問題にならないような何かに取り組んでいます。集中化、単純化、バックアップなどの他の要素は、この場合、データベースへの保存が意味があることを意味します。もう1つの一般的な理由はレプリケーションです。
LaVache 2013

4
一方、dbへのデータの保存はOSに依存しないため、奇妙なファイル名に適しています。dbは同じファイル名の複数のファイルを保存できますが、OSは保存できません。読み取り/書き込み/削除の問題はありません。追加のバックアップシステムは必要ありません。そして、それは公開されていません。そのため、開発が早い場合があります。ところで 誰もがすべてを同じデータベースに保存することを強制しているわけではなく、最終的にはすべてがディスクに保存されます。
Joeri

7
@AlexWeinstein、バイナリデータと固定幅データを混同しています。バイナリデータも固定幅にすることができます。また、固定幅データはすべての状況に適しているわけではありません。実際、多くの状況では、可変幅データの恩恵を受けるでしょう。dev.mysql.com
doc

4
これについては@Pacerierに同意し、BINARY(16)は固定保存されます。BLOBの場合:BLOBには、テーブルの外部に格納されているデータへの固定幅ポインターがあります。これは、インラインで格納するvarcharやvarbinaryとは異なります.blobを検索するにはいくつかの追加の手順が必要ですが、WHERE句から除外することで問題ありません。
Garr Godfrey、2015

4
また、ファイルシステムにファイルを保存することは非常に難しく、移植性がないと思います。ファイルが削除された場合はどうなりますか?
Garr Godfrey、2015


17

保存するデータによって異なります。上記の例ではLONGBLOBデータ型を使用していますが、他のバイナリデータ形式もあることに注意してください。

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

それぞれに使用例があります。それが既知の(短い)長さ(たとえば、パックされたデータ)である場合、頻繁に機能するBINARYか、VARBINARY機能します。それらには、インデックスを付けることができるという追加の利点があります。


14

必要ではありませんが、base64データをエンコードしてデコードすることもできます。つまり、dbにはASCII文字しかありません。少しスペースと時間がかかりますが、バイナリデータに関する問題はすべて解消されます。


11

- 非推奨 -BLOBフィールドが存在する場合、次の方法でデータを保存できます。

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

ここからのアイデア。


10

データをBLOBに取り込む方法も問題になります。PHPの例が示すように、データをINSERTステートメントに配置できます(ただし、addslashesの代わりにmysql_real_escape_stringを使用する必要があります)。ファイルがデータベースサーバーに存在する場合は、MySQLのLOAD_FILEも使用できます。


そのリンクは、MySQL_real_escape_stringが非推奨であることを示しています。
Poul Bak

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.