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?
问题分析与解决
- 参数绑定的编码丢失
直接用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();
- 读取时字段类型不匹配
即使配置了持久字段,若Open查询时未正确触发持久字段初始化,FieldByName可能返回默认的TStringField而非TWideStringField,导致编码转换错误。
解决方法:显式转换为TWideStringField读取:
TWideStringField* nameField = dynamic_cast<TWideStringField*>(SQLiteDataModule->Table2->FieldByName("Name")); UnicodeString Name = nameField->AsString;
调试窗口显示限制
部分调试窗口对Unicode字符串支持有限,即使内存中字符串正确,也可能显示问号。可将读取的字符串赋值给全局UnicodeString变量,通过TTreeNode显示验证实际内容是否正确。表字段编码配置问题
确认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
相关产品推荐
相关产品推荐

