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の問題だった
基本に立ち返って、MySQLのdocumentを参照してみた。
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 |