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

FireDAC TFDQuery无法保存/加载外文字符问题咨询

SQLite FireDAC Unicode显示问题排查

问题描述

我配置了SQLite数据库连接:

SQLiteFDConnection->Params->Values["StringFormat"]=_D("Unicode");
SQLiteFDConnection->Params->Values["OpenMode"]=_D("CreateUTF8");

通过两个TFDQuery访问表:

  • Table1(TFDQuery)有持久字段,通过TDataSource在TDBGrid显示,使用TWideStringField,外文显示正常。
  • Table2(TFDQuery)同样为TWideStringField持久字段,直接用ExecSQL执行INSERT/UPDATE,用Open+FieldByName读取,但外文显示为问号。

更新代码:

SQLiteDataModule->Table2->ExecSQL("UPDATE Table2 SET Name=:N where UniqueId=:U",
                 OPENARRAY(Variant, (UnicodeStringVarName, UniqueId)));

读取代码:

String Name=SQLiteDataModule->Table2->FieldByName("Name")->AsString;

调试窗口无法显示正确字符(显示?? ??),但普通字符串可在TTreeNode显示外文。String为UnicodeString,请问为何Table2无法正常使用Unicode?

问题分析与解决

  1. 参数绑定的编码丢失
    直接用Variant传递Unicode字符串时,可能因Variant默认编码转换丢失Unicode信息。FireDAC处理Variant类型参数时,若未明确指定编码,会将Unicode转成ANSI,插入后就变成问号。

解决方法:改用FireDAC参数绑定显式指定类型,避免Variant转换:

SQLiteDataModule->Table2->SQL->Text = "UPDATE Table2 SET Name=:N where UniqueId=:U";
SQLiteDataModule->Table2->ParamByName("N")->AsWideString = UnicodeStringVarName;
SQLiteDataModule->Table2->ParamByName("U")->AsInteger = UniqueId; // 根据实际字段类型调整
SQLiteDataModule->Table2->ExecSQL();
  1. 读取时字段类型不匹配
    即使配置了持久字段,若Open查询时未正确触发持久字段初始化,FieldByName可能返回默认的TStringField而非TWideStringField,导致编码转换错误。

解决方法:显式转换为TWideStringField读取:

TWideStringField* nameField = dynamic_cast<TWideStringField*>(SQLiteDataModule->Table2->FieldByName("Name"));
UnicodeString Name = nameField->AsString;
  1. 调试窗口显示限制
    部分调试窗口对Unicode字符串支持有限,即使内存中字符串正确,也可能显示问号。可将读取的字符串赋值给全局UnicodeString变量,通过TTreeNode显示验证实际内容是否正确。

  2. 表字段编码配置问题
    确认Table2的Name字段创建时是否指定UTF-8编码。SQLite默认用系统编码存储未指定编码的字段,会导致Unicode异常。可执行以下SQL检查表结构:

PRAGMA table_info(Table2);

若字段collation不是UTF-8相关规则,建议重新创建表时指定:

CREATE TABLE Table2 (
    UniqueId INTEGER PRIMARY KEY,
    Name TEXT COLLATE UTF8_GENERAL_CI
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:45:15