将Blob插入MySQL数据库仅插入NULL

时间:2019-05-07 11:39:26

标签: mysql database amazon-web-services blob amazon-rds-aurora

我尝试将本地磁盘(Windows 10)中的Blob插入我的RDS MySQL数据库。 但是我的查询没有插入Blob。新行具有所有其他列,但是blob为NULL。

INSERT INTO table VALUES('c1', LOAD_FILE('C:/testing.7z'));

这是我尝试过的:

  • 我将文件的权限设置为ro读/写。
  • secure_file_priv设置为/ tmp ...我不知道这意味着什么。这是路径还是变量?如果它是一个变量,我已经尝试从用户/系统变量“ TMP”的路径上载blob,但没有成功。 我无法更改secure_file_priv,因为RDS允许更改...如果它是路径,那么我必须从哪个路径上传文件?
  • max_allowed_pa​​cket设置为默认值(1024-1073741824字节)。我的文件大200 kb。

如何管理文件?

编辑: 我在我的本地数据库上尝试了同样的方法,并且可以正常工作-但仅对选择@@ secure_file_priv; 目录中的文件有效。

2 个答案:

答案 0 :(得分:0)

根据documentation,文件必须位于secure_file_priv中指定的目录中。因此,我建议您创建目录c:/mysql-uploads,更新secure_file_priv指向该目录并将文件放置在该目录中。我引用了文档:

  

如果文件不存在或由于不满足前述条件之一而无法读取,则该函数返回NULL。

更新

以上解决方案仅适用于文件位于数据库主机上的情况。由于您使用AWS RDS,因此您无权访问本地文件系统,因此无论为secure_file_priv设置什么值,都无法将文件复制到数据库主机。恐怕您将不得不使用客户端应用程序,该应用程序将使用客户端方法(即JDBC)插入内容/ blob。

您可以通过创建ConnectionPreparedStatement,使用setBinaryStream将文件流加载到Blob,然后调用executeUpdate来实现。完整示例:

Connection conn = DriverManager.getConnection(url,username,password);
String updateSQL = "INSERT INTO table VALUES(?,?)"
PreparedStatement pstmt = conn.prepareStatement(updateSQL);
File file = new File(filename);
FileInputStream input = new FileInputStream(file);
pstmt.setString(1, "c1");
pstmt.setBinaryStream(2, input);
pstmt.executeUpdate();

答案 1 :(得分:0)

您要插入NULL,因为文件必须相对于服务器主机,而不是相对于发出查询的计算机。

查询是文本,它们不是函数,因此您无法执行从计算机读取文件并将其传输到服务器的查询。

您可以使用一种熟悉的语言阅读文件并传输文件内容。

LOAD_FILE的文档:https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_load-file

重要摘录:

  

要使用此功能,文件必须位于服务器主机上,您   必须指定文件的完整路径名,并且您必须具有   FILE特权。