我尝试将本地磁盘(Windows 10)中的Blob插入我的RDS MySQL数据库。 但是我的查询没有插入Blob。新行具有所有其他列,但是blob为NULL。
INSERT INTO table VALUES('c1', LOAD_FILE('C:/testing.7z'));
这是我尝试过的:
如何管理文件?
编辑: 我在我的本地数据库上尝试了同样的方法,并且可以正常工作-但仅对选择@@ secure_file_priv; 目录中的文件有效。
答案 0 :(得分:0)
根据documentation,文件必须位于secure_file_priv
中指定的目录中。因此,我建议您创建目录c:/mysql-uploads
,更新secure_file_priv
指向该目录并将文件放置在该目录中。我引用了文档:
如果文件不存在或由于不满足前述条件之一而无法读取,则该函数返回NULL。
更新
以上解决方案仅适用于文件位于数据库主机上的情况。由于您使用AWS RDS,因此您无权访问本地文件系统,因此无论为secure_file_priv
设置什么值,都无法将文件复制到数据库主机。恐怕您将不得不使用客户端应用程序,该应用程序将使用客户端方法(即JDBC)插入内容/ blob。
您可以通过创建Connection
和PreparedStatement
,使用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特权。