web-dev-qa-db-ja.com

LOAD_FILEを使用してファイルをMySQLblobにロードする方法は?

(Macの)MySQLblobにファイルをロードしようとしました。

私の質問は

INSERT INTO MyTable VALUES('7', LOAD_FILE('Dev:MonDoc.odt'))

エラーは表示されませんが、ファイルはblobにロードされません。

9
Flex60460

手動 は次のように述べています。

LOAD_FILE(ファイル名)

ファイルを読み取り、ファイルの内容を文字列として返します。この機能を使用するには、ファイルがサーバーホスト上にあり、ファイルへのフルパス名を指定し、FILE権限を持っている必要があります。ファイルはすべて読み取り可能で、サイズがmax_allowed_pa​​cketバイト未満である必要があります。 secure_file_privシステム変数が空でないディレクトリ名に設定されている場合、ロードするファイルはそのディレクトリにある必要があります。

上記の条件のいずれかが満たされていないためにファイルが存在しないか、読み取ることができない場合、関数はNULLを返します。

MySQL 5.0.19以降、character_set_filesystemシステム変数は、リテラル文字列として指定されたファイル名の解釈を制御します。

mysql> UPDATE t
            SET blob_col=LOAD_FILE('/tmp/picture')
            WHERE id=1;

このことから、あなたの場合は間違っている可能性のあることが複数あります...

  • フルパスを通過していますか?
  • 特権は正しく設定されていますか?
  • 関数は何を返しますか?ヌル?
  • マニュアルに記載されているクエリで試してみましたか?
9
markus

Linuxでも同じ問題がありました...

select load_file('/tmp/data.blob');
+-----------------------------+
| load_file('/tmp/data.blob') |
+-----------------------------+
| NULL                        |
+-----------------------------+

最終的に、ユーザーとグループの所有権が「mysql」に変更された後、ファイルを正常にロードできました。

Sudo chown mysql:mysql /tmp/data.blob
5
rmv

windowsを使用している場合は、フルパスでスラッシュをダブルエスケープします。

3
kbc

テストで見つけたもう1つの警告を追加したかっただけです。

select load_file('/path/to/theFile.txt');を使用する場合ロードしているファイルSQLインスタンスが実行されているマシン上にある必要があります

MySQLワークベンチを使用してファイルをさまざまなSQLインスタンスに常にロードし、LOAD DATA LOCAL INFILE 'C:/path/to/theFile.csv' INTO TABLEのようなコマンドを使用すると、ローカルハードドライブからファイルを簡単に取得して処理するため、これは長い間私を悩ませました。実際のSQLインスタンスが実行されていた場所に関係なく、テーブルに格納されます。ただし、load_fileコマンドは、少なくとも私にとっては同じように動作しないようです(おそらく、私が知らないlocal_load_file()コマンドが存在します)。 MySQLは、SQLインスタンスが実行されているローカルシステムからのファイルの検索のみを許可しているようです。

したがって、あなたが私のようで、load_fileが常にNULLを返す理由がわからない場合は、恐れることはありません...ファイルをSQLサーバーインスタンスにアップロードしてから、クエリブラウザからそのパスを使用するとすべてうまくいきます。

3
Uncle Iroh

ありがとう。

Mysqlを実行しているユーザーは、ファイルを所有する必要があります。私の間違いは、ファイルを読み取ったり実行したりできる必要があると思ったからです。

0
William Choy