使用Unicode/CreateUTF16创建SQLite库后,TFDQuery打开报类型不匹配错误原因?
C++Builder FireDAC连接SQLite Unicode配置异常解决
问题背景
原配置StringFormat=Choose、OpenMode=CreateUTF8下,VARCHAR字段无法存储日文(显示为??),修改为Unicode配置后:
SQLiteFDConnection->Params->Values["StringFormat"]=_T("Unicode"); SQLiteFDConnection->Params->Values["OpenMode"]=_T("CreateUTF16"); // 注:使用CreateUTF8创建也会出现相同问题
打开新数据库触发异常:
Project raised exception class EDatabaseError with message 'Table1: Type mismatch for field 'Name', expecting: String actual: WideString'.
将VARCHAR替换为NVARCHAR、改回默认配置后仍触发相同异常,错误发生在AfterConnect事件的FDQuery->Open()操作。
解决方案
1. 修正静态字段类型(核心原因)
异常本质是设计时添加的静态字段类型与FireDAC返回的类型不匹配:
- 当
StringFormat=Unicode时,SQLite的VARCHAR字段会被FireDAC映射为WideString/UnicodeString类型 - 若你在设计时为
Name字段添加的是TStringField(对应AnsiString),就会触发类型不匹配错误
解决方法:
- 打开FDQuery的字段编辑器
- 将
Name字段从TStringField修改为TWideStringField
2. 完善Unicode配置参数
在FDConnection的参数中补充字符集配置,确保编码一致性:
SQLiteFDConnection->Params->Values["StringFormat"] = _T("Unicode"); SQLiteFDConnection->Params->Values["OpenMode"] = _T("CreateUTF16"); // 或CreateUTF8,按需选择 SQLiteFDConnection->Params->Values["Charset"] = _T("UTF-8");
3. 关于NVARCHAR的说明
SQLite本身不存在NVARCHAR类型,它会自动将NVARCHAR映射为TEXT类型,因此修改字段类型为NVARCHAR无法解决问题,无需尝试。
4. 动态字段的适配(若使用动态生成字段)
若你未手动添加静态字段,而是依赖FireDAC动态生成字段:
- 确保FDConnection的
Params中没有覆盖类型映射的配置 - 可以添加
MetaDefSchema=SQLite参数,强制FireDAC使用SQLite的默认元数据映射规则:SQLiteFDConnection->Params->Values["MetaDefSchema"] = _T("SQLite");
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

