我正在尝试将图像数据加载到 Azure 数据库 MySQL 上的行列中。这是我试图通过 MySQL Workbench 运行的 SQL 语句...
insert into pm1.c1 (id,source,image) values ('1','a',load_file('/usr/csuser/clouddrive/a.jpg'));
它产生了良好的结果,但图像列为空。挑战是从服务器实例授予对文件的访问权限。我发现一篇博客文章似乎让我走上了正轨......
这涉及运行创建 Blob 存储的云 shell。我将 a.jpg 图像上传到文件共享。当然无法从 MySQL 服务器访问,因此结果为空。
显然我需要某种类型的 UNC 语法来引用 load_file 调用中的文件。无法弄清楚那可能是什么。 Azure 存储连接字符串希望您在服务器上安装卷,但据我所知,无法连接到运行 MySQL 实例的主机。
最佳答案
来自MySQL文档load_file() :
读取文件并以字符串形式返回文件内容。使用此功能:
- 该文件必须位于服务器主机上,您必须指定 文件的完整路径名,并且您必须具有 FILE 权限。
- 该文件必须能够被服务器读取并且其大小小于
max_allowed_packet
字节。 - 如果
secure_file_priv
系统变量设置为非空 目录名,要加载的文件必须位于该目录中 目录。 (在 MySQL 8.0.17 之前,该文件必须可供所有人读取, 不仅仅是服务器可读。)
如果文件不存在或由于不满足上述条件之一而无法读取,则函数返回 NULL。
其他更多详细信息:
MySQL LOAD_FILE函数是需要满足几个条件才能成功执行的。
- 您尝试加载的文件必须存在于同一主机中 MySQL 服务器正在运行的地方。例如,如果您的 MySQL 服务器是 安装在 example.com 上,文件必须仅存在于 example.com 上。
- 必须指定文件的完整路径名。所以,如果你的文件是 位于用户的主目录中,假设用户名是 w3r,您 必须指定“/home/w3r/somefile.txt”
- 执行该命令的用户必须具有 FILE 权限。您可以 使用以下“GRANT FILE on dbname.*”向用户授予 FILE 权限 发送至用户@localhost”。
- 相关文件必须可供所有人读取。如果您尝试加载 用户主目录层次结构中不存在的文件, 确保您拥有该文件的读取权限。
- MySQL 服务器有一个 max_allowed_packet 变量。有问题的文件必须 不超过该变量中指定的值。您可以检查以下值 max_allowed_packet 带有“显示变量,例如 '%max_allowed_packet%';';您必须拥有 MySQL root 权限 执行这个命令。您更改 max_allowed_packet 的值 你的 MySQL 配置文件。打开你的 my.ini 或 my.cnf 文件,找到 max_allowed_packet=some_value 行并将值更改为您的 所需的一个,例如,如果您想将 valle 设置为 50MB, 写入 50MB。
- MySQL 有一个 secure_file_priv 变量。如果该变量的值为 设置为非空目录名,要加载的文件必须是 位于该目录中。您可能会找到 secure_file_priv 变量 及其值,并且可以在您的 MySQL 配置文件中更改它。
引用:MySQL LOAD_FILE() function和 How the LOAD_FILE() Function Works in MySQL
希望这有帮助。
关于mysql - 如何将 load_file 与 Azure Database for MySQL 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699527/