我尝试从本地磁盘(Windows 10)插入一个blob到我的RDS MySQL数据库。但是我的查询并没有插入blob。新行包含所有其他列,但blob为NULL。
INSERT INTO table VALUES('c1', LOAD_FILE('C:/testing.7z'));
以下是我尝试的:
- 我把文件的权限设置为读/写。
- secure_file_priv设置为/tmp...我不知道这是什么意思。这是路径还是变量?如果它是一个变量,我已经尝试从用户/系统变量“TMP”的路径上传blob,但没有成功。我无法更改secure_file_priv,因为RDS允许更改...如果是路径,那么我必须从哪个路径上传文件?
- max_allowed_packet设置为默认值(1024-1073741824字节)。我的文件是200 KB大。
我怎样才能上传文件?
编辑:我在我的本地数据库上尝试了同样的方法,它工作了-但只对select @@secure_file_priv目录中的文件有效;.
3条答案
按热度按时间px9o7tmv1#
根据文档,该文件需要位于
secure_file_priv
中指定的目录中。因此,我建议您创建一个目录c:/mysql-uploads
,更新secure_file_priv
以指向该目录,并将文件放在该目录中。我引用文档:如果文件不存在或由于不满足上述条件之一而无法读取,则函数返回NULL。
更新
上述解决方案仅适用于文件位于数据库主机上的情况。由于您使用AWS RDS,因此无法访问本地文件系统,因此无论为
secure_file_priv
设置了什么值,您都无法将文件复制到数据库主机。恐怕你将不得不使用一个客户端应用程序,它将使用客户端方法插入内容/blob(即JDBC)。您可以通过创建一个
Connection
和一个PreparedStatement
来实现这一点,使用setBinaryStream
将文件流加载到blob中,然后调用executeUpdate
。完整示例:bxgwgixi2#
您正在插入
NULL
,因为文件必须相对于 * 服务器主机 *,而不是发出查询的计算机。查询是 * 文本 *,它们不是函数,所以你不能执行一个从你的计算机读取文件并将其传输到服务器的查询。
您可以使用您熟悉的语言之一读取文件并传输文件的内容。
LOAD_FILE
的文档:https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_load-file重要摘录:
要使用此功能,文件必须位于服务器主机上,您必须指定文件的完整路径名,并且您必须具有FILE权限。
e7arh2l63#
您可以通过将blob加载到S3存储桶中并将s3文件的引用位置存储在表中来完成等效操作。