You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何MyDAC TMyConnection执行查询会因IPv4/IPv6协议切换失败?

TMyConnection连接MySQL时IP协议不一致导致权限错误的问题

场景

我的应用通过数据库所在服务器上的小型PHP脚本获取用户公网IP,随后自动将该IP插入远程主机表,以通过3306端口远程访问数据库执行查询等操作。
首次获取的IP可能是IPv4或IPv6(取决于服务器),存储后通过设置TMyConnection.Connected = True测试连接(可正常连接后断开)。后续使用TMyQuery执行查询时,会重新连接(或由查询自动触发)并执行查询。
我可确保获取到纯IPv4地址,因此可统一使用IPv4并存储至远程主机表。

问题

假设远程主机表中存储了IPv4地址(如185.83.68.71)且测试连接通过,但有时(非总是)后续执行查询时,数据库返回错误:

Connection Error :#28000Access denied for user 'myuser'@'2a0c:5c86:8220:1:8905:f958:d2f8:368d' (using password: YES)

即TMyConnection此时尝试使用用户的IPv6地址连接数据库,因该地址未在远程主机表中导致失败。
反之,存储IPv6地址且测试连接正常,但后续TMyConnection使用IPv4地址连接也会因地址未入库而失败。

疑问

  1. TMyConnection每次连接时是否会自行获取用户IP,且可能返回与应用获取的协议不同的地址?若否,它如何确定使用IPv4还是IPv6协议连接?
  2. 是否可强制TMyConnection始终使用IPv4?如此应用可统一获取IPv4地址并存储,确保与TMyConnection使用的地址匹配。

(我已在Devart论坛发布类似问题,但该论坛活跃度不高,故在此求助!)


解答

针对疑问(1)

TMyConnection不会主动获取用户IP,它使用的连接IP协议由操作系统的DNS解析结果和网络栈优先级决定:

  • 当数据库服务器域名同时解析出IPv4和IPv6地址时,Windows等系统默认会优先尝试IPv6连接(取决于系统的PrefixPolicy设置);如果首次测试连接时刚好命中IPv4,后续重连时可能因系统网络策略变化或DNS解析结果变动,转而使用IPv6地址发起连接,导致权限校验失败。
  • 你看到的'myuser'@'IPv6地址'是数据库服务器端识别到的客户端连接地址,并非TMyConnection主动获取的,而是客户端发起连接时使用的本地出口IP(由用户网络环境决定,可能同时存在IPv4和IPv6出口)。

针对疑问(2)

可以强制TMyConnection使用IPv4,有两种可靠方式:

  1. 直接指定数据库服务器的IPv4地址:
    不要使用域名作为Server属性值,直接填写数据库服务器的IPv4地址(如185.83.68.71),这样TMyConnection只能通过IPv4协议发起连接,避免DNS解析带来的协议切换。
  2. 修改连接参数强制IPv4:
    在TMyConnection的连接字符串中直接指定协议参数,示例如下:
    MyConnection1.ConnectionString := 'Server=your_db_host;Port=3306;UserID=myuser;Password=xxx;PROTOCOL=TCP;IP=4';
    
    (注:部分Devart版本可能参数名略有差异,可参考对应版本官方文档调整)

内容的提问来源于stack exchange,提问作者user2834566

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:05:24