Skip to content

MySQL 节点常见问题#

以下是 MySQL 节点的一些常见错误和问题,以及解决方法或排查步骤。

通过复合键更新行#

MySQL 节点的更新操作允许您通过提供匹配列和值来更新表中的行。这适用于可以通过单列值唯一标识行的表。

对于使用复合键的表(需要多列才能唯一标识行),您不能使用此模式。例如 MySQL 的 mysql 数据库中的 user,需要同时使用 userhost 列才能唯一标识行。

要更新具有复合键的表,请改用执行 SQL 操作手动编写查询。在那里,您可以匹配多个值,如下例同时匹配 customer_idproduct_id

1
UPDATE orders SET quantity = 3 WHERE customer_id = 538 AND product_id = 800;

使用 Docker 时无法连接到本地 MySQL 服务器#

当您在 Docker 中运行 n8n 或 MySQL 时,需要配置网络以使 n8n 能够连接到 MySQL。

解决方案取决于您如何托管这两个组件。

仅 MySQL 运行在 Docker 中#

如果只有 MySQL 运行在 Docker 容器内,需要配置 MySQL 监听所有网络接口(绑定到容器内的 0.0.0.0,官方镜像已默认采用此配置)。

运行容器时,使用 -p 参数发布端口。MySQL 默认使用 3306 端口,因此 Docker 命令应如下所示:

1
docker run -p 3306:3306 --name my-mysql -d mysql:latest

配置 MySQL 凭据时,localhost 地址可直接使用(将 Host 设置为 localhost)。

仅 n8n 运行在 Docker 中#

如果只有 n8n 运行在 Docker 容器内,需要配置主机上的 MySQL 监听所有网络接口(绑定到 0.0.0.0)。

Linux 上运行 Docker 版 n8n 时,启动容器需使用 --add-host 参数将 host.docker.internal 映射到 host-gateway。例如:

1
docker run -it --rm --add-host host.docker.internal:host-gateway --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

如果使用 Docker Desktop,此配置会自动完成。

配置 MySQL 凭据时,请使用 host.docker.internal 作为 Host 地址而非 localhost

当 MySQL 和 n8n 运行在独立的 Docker 容器中#

如果 n8n 和 MySQL 分别运行在不同的 Docker 容器中,可以通过 Docker 网络连接它们。

配置 MySQL 容器监听所有接口(绑定到 0.0.0.0,官方镜像已默认采用此配置)。将 MySQL 和 n8n 容器加入同一个用户自定义桥接网络

在配置 MySQL 凭据时,使用 MySQL 容器名称作为主机地址而非 localhost。例如,若将 MySQL 容器命名为 my-mysql,则应将 Host 设置为 my-mysql

当 MySQL 和 n8n 运行在同一个 Docker 容器中#

如果 MySQL 和 n8n 运行在同一个 Docker 容器内,localhost 地址无需特殊配置。可以配置 MySQL 监听 localhost,并在 n8n 的 MySQL 凭据配置中将 Host 设为 localhost

十进制数以字符串形式返回#

默认情况下,MySQL 节点会将 DECIMAL 类型值作为字符串返回。这是有意为之的设计,目的是避免由于 JavaScript 数字表示方式的限制而可能导致精度损失。您可以在 n8n 使用的 MySQL 库文档中了解更多关于此决策的背景信息。

若要以数字形式输出十进制值(忽略可能的精度损失风险),请启用 Output Decimals as Numbers(将十进制数输出为数字)选项。这将使返回值以数字形式而非字符串形式输出。

作为替代方案,您可以在 MySQL 节点之后使用 toFloat() 函数配合 toFixed(),或使用 Edit Fields (Set) 节点手动将字符串转换为十进制数。但请注意,您可能仍需处理潜在的精度损失问题。