
1. Delphi 零基础用 FireDAC 连 MySQL 到底难在哪如果你刚开始用 Delphi 写点小工具大概率会遇到这个场景界面拖完了按钮也摆好了结果一到连数据库就卡住。报错五花八门Cannot load vendor library、Unknown MySQL server host、中文变问号随便一个都能耗掉一下午。我当初也是从拖组件开始的觉得可视化最省事但 FireDAC 连 MySQL 这件事光靠拖组件还不够得把驱动、参数、字符集这几块理清楚。FireDAC 是 Delphi 自带的一套数据访问框架它能连 MySQL、SQL Server、SQLite、Oracle 等一堆数据库。对 Delphi 零基础的人来说它的好处是组件化程度高TFDConnection、TFDQuery、TDataSource、TDBGrid拖一拖就能出结果。但它的坑也很集中MySQL 驱动不是 Delphi 自带的你得自己准备libmysql.dll连接参数写错一个字母就连不上字符集不指定中文直接乱码。这篇要解决的就是这条完整路径从驱动选型、组件摆放、参数配置到查询验证和增删改查跑通。同时我会把多环境凭据管理这件事一起说清楚——你本地开发、测试库、线上库如果各写一套账号密码改起来很容易漏。用 TaoToken 的统一 Key 和 API 通道来管理这些凭据可以让配置更干净切换环境时不用满项目找密码。适合谁看刚接触 Delphi、想用 FireDAC 连 MySQL 做个小工具或课程作业的人已经能连上但总被字符集或驱动路径坑的人以及想把数据库凭据从代码里抽出来、统一管理的人。下面按可复制的步骤来每一步都给完整代码和参数你照着改改就能跑。2. TaoToken 统一 Key 与 API 通道的前置准备在正式写 FireDAC 连接之前先把凭据管理这块理顺。很多人写小工具的习惯是直接把数据库账号密码硬编码在FormCreate里本地跑没问题但一旦要换库、换机器、或者把代码发给别人就得手动改。更麻烦的是如果你同时用多个环境密码散落在不同单元里排查起来很痛苦。TaoToken 在这里的角色是统一 Key 和 API 通道管理。你可以把它理解成一个凭据中转层数据库连接信息、模型调用 Key、不同环境的配置都通过统一的 Key 来引用而不是散落在代码各处。对 Delphi 项目来说最直接的好处是TFDConnection.Params里的User_Name、Password、Server这些值可以从统一配置读取切换环境时只改一处。具体操作上先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录然后在控制台里创建你的 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 进去之后找到 API Keys 页面新建一个 Key 并复制保存。这个 Key 就是你后续调用统一通道的凭证。如果你后面还要接模型对话或编码辅助可以顺便看下模型对话入口 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 和 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。不过这篇的重点是数据库连接所以 Key 拿到之后我们主要用它来管理数据库凭据。这里要强调一点TaoToken 不是让你把 MySQL 连接直接走它的 API而是用它来统一管理你的凭据和配置。FireDAC 连 MySQL 仍然是本机直连libmysql.dll和TFDPhysMySQLDriverLink该配还得配。TaoToken 解决的是“密码写在哪、怎么切换、怎么不泄露”的问题。你可以把数据库连接串存成配置通过统一 Key 拉取代码里只保留 Key 的引用。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的 Key 使用说明和 API 通道配置方式。API 基础地址是 https://taotoken.net/api 注意这个地址不加 UTM 参数直接用于程序内调用。API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 你可以在这里随时轮换 Key。对 Delphi 零基础的人来说这一步不用想太复杂先拿到 Key知道它放在哪后面配置TFDConnection时把敏感字段替换成从统一配置读取就行。如果你暂时只想跑通本地连接也可以先硬编码等跑通后再把凭据抽出来。但建议一开始就养成习惯不然后面改起来更麻烦。3. 可复制的 FireDAC 连接配置与组件参数模板这一节是核心直接给可复制的配置。先说组件清单在 Delphi 的 Tool Palette 里找到 FireDAC 页签拖这几个到 Form 上TFDPhysMySQLDriverLink、TFDGUIxWaitCursor、TFDConnection、TFDQuery、TDataSource、TDBGrid。再放一个TButton用来触发查询。TFDGUIxWaitCursor不用改属性它负责 SQL 执行时的等待光标。TFDPhysMySQLDriverLink是关键它的VendorLib属性要指向你本机libmysql.dll的完整路径。这个 dll 不在 Delphi 安装目录里你需要单独准备。通常 MySQL 安装目录下的lib文件夹里有比如D:\MySQL\lib\libmysql.dll。如果没有去 MySQL 官方下载对应版本的 Connector/C解压后找到libmysql.dll。注意位数要匹配你的 Delphi 编译目标是 32 位就放 32 位 dll64 位就放 64 位 dll混了会报Cannot load vendor library。TFDConnection的配置分两部分。属性面板里设DriverName为MySQLLoginPrompt设为False避免每次弹登录框。重点是Params点进去填这些DriverIDMySQL Server127.0.0.1 Port3306 Databaseyour_database User_Nameyour_user Passwordyour_password CharacterSetutf8mb4这里CharacterSet建议用utf8mb4比gb2312兼容性更好中文和 emoji 都不会乱。如果你用的是老版本 MySQL 且表是 gb2312那就按实际字符集填但新项目一律 utf8mb4。如果你想把配置写成代码在FormCreate里这样写procedure TForm1.FormCreate(Sender: TObject); begin FDConnection1.Close; FDConnection1.Params.Clear; FDConnection1.Params.Add(DriverIDMySQL); FDConnection1.Params.Add(Server127.0.0.1); FDConnection1.Params.Add(Port3306); FDConnection1.Params.Add(Databaseyour_database); FDConnection1.Params.Add(User_Nameyour_user); FDConnection1.Params.Add(Passwordyour_password); FDConnection1.Params.Add(CharacterSetutf8mb4); FDConnection1.Connected : True; end;如果你用 TaoToken 统一管理凭据可以把Server、User_Name、Password这些值从配置读取代码里只保留 Key 引用。比如用一个TIniFile或 JSON 配置文件存环境信息Key 存在环境变量里。这样切换环境时只改配置文件不用动代码。TFDQuery的Connection属性指向FDConnection1TDataSource的DataSet指向FDQuery1TDBGrid的DataSource指向DataSource1。按钮的OnClick里写procedure TForm1.btnQueryClick(Sender: TObject); begin FDQuery1.Close; FDQuery1.SQL.Text : SELECT * FROM your_table; FDQuery1.Open; end;这样点按钮就能在TDBGrid里看到数据。增删改查的写法也类似INSERT、UPDATE、DELETE用ExecSQLSELECT用Open。注意ExecSQL之后如果要刷新显示重新Open一次查询即可。关于libmysql.dll的路径建议放在项目输出目录和 exe 同级这样VendorLib可以直接写libmysql.dll不用写绝对路径换机器也能跑。如果放别处就写完整路径。这一步踩过的坑最多路径错、位数错、dll 版本和 MySQL 服务端不匹配都会连不上。4. 三步连通性验证与增删改查成功结果配置写完之后不要急着写业务逻辑先做连通性验证。分三步每步都有明确的成功标志。第一步验证驱动加载。在FormCreate里Connected : True之前先加一句FDPhysMySQLDriverLink1.VendorLib : libmysql.dll;然后运行程序。如果驱动加载失败会立刻报Cannot load vendor library [libmysql.dll]。成功的话不会有提示直接进入下一步。如果报错检查 dll 是否在 exe 同级目录、位数是否匹配。第二步验证连接。Connected : True执行后如果账号密码或库名错会报Access denied for user或Unknown database。成功的话FDConnection1.Connected为True你可以加一句ShowMessage(连接成功)确认。这一步还要验证字符集在TFDQuery里执行SELECT 中文测试 AS t看TDBGrid里显示是否正常。如果显示问号说明CharacterSet没生效检查参数拼写。第三步验证增删改查。建一张测试表CREATE TABLE test_user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;然后在 Delphi 里写四个按钮分别对应增删改查// 增 FDQuery1.SQL.Text : INSERT INTO test_user (name, age) VALUES (:name, :age); FDQuery1.ParamByName(name).AsString : 张三; FDQuery1.ParamByName(age).AsInteger : 25; FDQuery1.ExecSQL; // 查 FDQuery1.SQL.Text : SELECT * FROM test_user; FDQuery1.Open; // 改 FDQuery1.SQL.Text : UPDATE test_user SET age :age WHERE name :name; FDQuery1.ParamByName(age).AsInteger : 26; FDQuery1.ParamByName(name).AsString : 张三; FDQuery1.ExecSQL; // 删 FDQuery1.SQL.Text : DELETE FROM test_user WHERE name :name; FDQuery1.ParamByName(name).AsString : 张三; FDQuery1.ExecSQL;每执行一步重新Open查询看TDBGrid结果。成功标志插入后能查到新记录更新后年龄变了删除后记录消失。如果ExecSQL报SQL command not properly ended检查 SQL 语句有没有多余分号如果参数报Parameter not found检查ParamByName的名字和 SQL 里的占位符是否一致。实测下来这套流程跑通之后后面接任何业务表都是复制粘贴改表名。多环境切换时把TFDConnection.Params里的值换成从 TaoToken 统一配置读取代码不用动。比如本地用127.0.0.1测试库用另一台机器只改配置文件里的Server和Database即可。5. 本篇常见报错排查对照这一节把最容易遇到的报错列出来对照着查。Cannot load vendor library [libmysql.dll]驱动 dll 没找到或位数不对。解决把libmysql.dll放到 exe 同级目录确认 Delphi 编译目标位数和 dll 位数一致。32 位 Delphi 配 32 位 dll64 位配 64 位。Access denied for user rootlocalhost账号密码错或者该用户没有从当前主机连接的权限。解决检查User_Name和Password确认 MySQL 里该用户允许从127.0.0.1或localhost连接。Unknown database xxx库名写错或库不存在。解决在 MySQL 里SHOW DATABASES;确认库名注意大小写。Unknown MySQL server host xxxServer参数写错或者本机没启动 MySQL 服务。解决确认Server是127.0.0.1或实际 IP检查 MySQL 服务是否运行。Client does not support authentication protocolMySQL 8 默认认证插件和旧版libmysql.dll不匹配。解决换新版 Connector/C 的 dll或者把用户认证方式改成mysql_native_password。中文乱码显示问号CharacterSet没设或设错。解决参数里加CharacterSetutf8mb4同时确认表和字段的字符集也是 utf8mb4。SQL command not properly endedSQL 语句末尾多了分号或者语法不对。解决FireDAC 里SQL.Text不要带末尾分号。Parameter xxx not foundParamByName的名字和 SQL 占位符不一致。解决统一用:name格式检查拼写。Connection is not open在Connected : False或未连接时执行了查询。解决先FDConnection1.Connected : True;再操作TFDQuery。OAuth或local proxy failed这类报错如果你在用统一 Key 通道调用模型或 API 时遇到检查 Key 是否有效、API 基础地址是否为 https://taotoken.net/api 。API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 可以重新生成 Key。接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里有完整的错误码说明。reading choices报错通常出现在模型调用返回解析时检查请求体格式和模型 ID 是否正确。如果你在 Delphi 里用TNetHTTPClient调 API确认 JSON 字段名和文档一致。排查顺序建议先看驱动再看连接再看 SQL最后看字符集。大部分问题集中在前两步。把TFDConnection的Connected设为True时如果没报错说明驱动和连接都通了剩下的就是 SQL 和字符集问题。6. 多环境凭据管理与后续接入建议跑通单机连接之后下一步就是把凭据管理规范化。Delphi 项目里常见的做法是用TIniFile或 JSON 配置文件存环境信息代码里读配置。但配置文件本身如果明文存密码也有泄露风险。这时候用 TaoToken 的统一 Key 来管理就更合适配置文件里只存 Key 的引用实际凭据通过 API 通道拉取。具体做法在 TaoToken 控制台创建不同环境的配置每个环境对应一组数据库连接信息。Delphi 程序启动时用统一 Key 调用 API 获取当前环境的配置然后填充TFDConnection.Params。这样切换环境只需要改一个环境变量或配置项不用改代码也不用把密码写死在 exe 里。如果你后面还要接模型对话或编码辅助模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关接入看 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite 。这些通道和数据库凭据管理可以共用同一套 Key 体系维护起来更省心。对 Delphi 零基础的人来说不用一上来就搞全套。先把 FireDAC 连 MySQL 跑通能查能改再逐步把凭据抽出来。抽的时候注意TFDConnection.Params里的Password不要出现在日志或异常信息里TFDPhysMySQLDriverLink.VendorLib的路径尽量用相对路径libmysql.dll跟着 exe 走不要依赖系统目录。最后给一个实用技巧在FormClose里加FDConnection1.Connected : False;避免程序退出时连接没释放。如果频繁开关连接影响性能可以用TFDConnection的连接池但小工具一般不需要。增删改查跑通之后把 SQL 语句抽到常量或资源文件里代码会干净很多。