起因是这样的,想用LOAD_FILE()这个函数来读取文件,却发现不管怎么设置都是返回NULL。

我的MYSQL版本为5.5.55

官方手册对LOAD_FILE()这个函数的描述如下:

LOAD_FILE(file_name)

读取文件并将这一文件按照字符串的格式返回。 文件的位置必须在服务器上,你必须为文件制定路径全名,而
且你还必须拥有FILE 特许权。文件必须可读取,文件容量必须小于 max_allowed_packet字节。
若文件不存在,或因不满足上述条件而不能被读取, 则函数返回值为 NULL。

一开始误解了FILE 特许权,以为是设置文件的权限为777就OK了,后来才发现错了。
继续查看官方手册,有一段话如下:

FILE权限给予你用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读和写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器能读或
写的任何文件。(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。 FILE权限允许用户在MySQL服务器具有写权限的目录下创建
新文件。不能覆盖已有文件。

后来又根据网上提供的查找权限命令:

mysql> show variables like '%secure%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_auth      | OFF                   |
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
2 rows in set (0.00 sec)

可以发现secure_file_priv这个变量设置为了/var/lib/mysql-files/

也就是说,当前只有/var/lib/mysql-files/这个路径具有读写权限的,其余路径没有。

secure-file-priv特性

secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

  • 值为null ,表示限制mysqld 不允许导入/导出。
  • 值为/tmp/ ,表示限制mysqld 的导入/导出只能发生在/tmp/目录下。
  • 值没有具体值时,表示不对mysqld 的导入/导出做限制。

解决问题:

windows下:修改my.ini[mysqld]内加入secure_file_priv =

linux下:修改my.cnf[mysqld]内加入secure_file_priv =

然后重启mysql,再查询secure_file_priv

注:

mysql> set global secure_file_priv='/tmp';
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable

因为secure_file_priv参数为只读参数,所以目前只知道得采用在配置文件中更改该参数,之后重启数据库这种办法 = =….