今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

MySQLのLOAD_FILEではまった

LOAD_FILEがNULLを返す?

 

MySQLのblob列に画像データを突っ込もうとして、

insert into xxx values(
    ...,
    load_file('/data/image.jpg') );

のようなSQLを投げてみたが、どうしてもNULLになってしまう。

ファイルはちゃんとあるのに…、なぜだろう?

 

パス指定の問題?

Windowsだから、

load_file('C:\\data\\image.jpg')

のように指定する必要があるのかな?、と思ったけれど、これでもだめだった。

なお、'\'は2つ重ねて'\\'のようにエスケープする必要がある。

 

権限の問題?

調べてみたところ、以下の権限が必要なようだ。

SQLを実行するMySQLユーザに、FILE権限があること

MySQLサーバを実行しているOSユーザに、該当ファイルへのアクセス権限があること

両方ちゃんとあるんだけどな。。

 

システム変数secure_file_privの問題だった

基本に立ち返って、MySQLdocumentを参照してみた。

If the secure_file_priv system variable is set to a nonempty directory name, the file to be loaded must be located in that directory.

という一文がある。

MySQLにログインして確認してみると…、

mysql> show variables like 'secure_file_priv';
+------------------+------------------------------------------------+
| Variable_name    | Value                                          |
+------------------+------------------------------------------------+
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 5.6\Uploads\ |
+------------------+------------------------------------------------+
1 row in set (0.00 sec)

どうやら、インストール時にデフォルトで設定されていたようだ。

my.iniのsecure-file-privを書き換えて、MySQLを再起動したら、無事LOAD_FILEが成功した!

 

OS Windows 7 Enterprise
MySQL 5.6.27