我正在尝试将图像数据加载到 Azure 数据库 MySQL 上的行列中。 这是我尝试通过MySQL工作台运行的SQL语句...
insert into pm1.c1 (id,source,image) values ('1','a',load_file('/usr/csuser/clouddrive/a.jpg'));
它产生一个很好的结果,但图像列为空。 挑战在于从服务器实例授予对文件的访问权限。 我发现了一篇博客文章,似乎让我走上了正确的轨道......
https://techcommunity.microsoft.com/t5/azure-database-for-mysql/backup-azure-database-for-mysql-to-a-blob-storage/ba-p/803830
这涉及运行创建 Blob 存储的云外壳。 我将 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 权限。你可以 向具有以下"在 dbname 上授予文件"的用户授予文件权限。 到user@localhost"。
- 有问题的文件必须可供所有人读取。如果您尝试加载 用户主目录层次结构中不存在的文件, 确保您对文件具有读取权限。
- MySQL Server有一个max_allowed_packet变量。有问题的文件必须 不超过该变量中指定的值。您可以检查价值 max_allowed_packet "显示变量,例如 "%max_allowed_packet%";";您必须具有 MySQL 根权限 执行此命令。更改 max_allowed_packet 的值 您的 MySQL 配置文件。打开您的 my.ini 或 my.cnf 文件,找到 行 max_allowed_packet=some_value 并将值更改为您的 想要一个,例如,如果您想将山谷设置为50MB, 写入 50MB。
- MySQL有一个secure_file_priv变量。如果该变量的值为 设置为非空目录名,要加载的文件必须是 位于该目录中。您可能会找到secure_file_priv变量 及其值,并可能在MySQL配置文件中更改它。
参考:MySQL LOAD_FILE(( 函数和 LOAD_FILE(( 函数在 MySQL 中的工作原理
希望这有帮助。
这个问题的答案是,load_file从根本上与适用于MySQL的Azure Database 不兼容。 文档中没有关于这种不兼容性的内容。
我知道它不兼容的原因是它在Google Cloud SQL for MySQL的文档中被特别列为不兼容:https://cloud.google.com/sql/docs/mysql/features
我一次又一次地看到这个...如果一个云服务器有东西,那么其他云服务器会争先恐后地获取它。 相反,如果某个云不支持某些内容,那么您可以确定其他云不支持它。
load_file((显然被视为一个安全漏洞。 因此,使用 load_file(( 的方法是,需要有一个运行load_file的本地数据库,然后将数据导出到平面文件,然后将其导入 Azure 数据库 MySQL。