集成节点/Built in_nodes/Actions/MySQL
MySQL 节点常见问题#
以下是使用 MySQL 节点 时的一些常见错误和问题,以及相应的解决或排查步骤。
通过复合键更新行#
MySQL 节点的 Update(更新) 操作允许你通过指定一个 匹配列(Column to Match On) 及其值来更新表中的行。这种方式适用于可以通过单个列值唯一标识每一行的表。
但对于使用 复合键(composite keys) 的表,此方式无法使用——这类表需要多个列组合才能唯一确定一行。例如,在 mysql 数据库中的 user 表 就是一个典型例子,必须同时使用 user 和 host 列才能唯一标识某一行。
要更新具有复合键的表,请改用 Execute SQL(执行 SQL) 操作手动编写查询语句。这样你可以基于多个条件进行匹配。例如以下语句同时基于 customer_id 和 product_id 进行匹配:
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
| ```
docker3306:3306---|---
在配置 MySQL 凭据 时,localhost 地址应能正常工作(将 Host 设置为 localhost)。
如果只有 n8n 在 Docker 中#
如果仅 n8n 运行在 Docker 容器中,请配置主机上的 MySQL 监听所有接口,即绑定到 0.0.0.0。
如果您在 Linux 上通过 Docker 运行 n8n,请在启动容器时使用 --add-host 标志将 host.docker.internal 映射到 host-gateway。例如:
1| ``` docker5678:5678
---|---
如果您使用的是 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) 节点 手动将字符串转换为小数。请注意,即便如此,仍可能存在精度损失,需自行处理。