读取FTS表时不支持FIREDAC-UTF8编码

时间:2017-01-23 09:58:04

标签: sqlite delphi delphi-xe3 firedac

当在带有Firedac的DELPHI XE3中我们创建一个表table0并以UTF8编码插入文本时一切正常。

CREATE TABLE table0 (mytext Ntext,publishdate date);
INSERT INTO table0 (mytext,publishdate) VALUES ('привет','1998-12-07');

但是,当我们创建一个FTS表并以UTF8插入文本时。

CREATE VIRTUAL TABLE table1 USING FTS4(mytext,publishdate);
INSERT INTO table1 (mytext,publishdate) VALUES ('привет','1998-12-07');

并使用

读取数据
SELECT mytext FROM table1

我们得到“??????”。

SQLITE Expert Personal中的相同命令返回“привет”。这意味着在Insert命令之后的表中我们有'привет'并且select返回不是UTF8编码的数据。

使用Firedac

从表中获取正确的值可以做些什么
ADQuery.Open('SELECT mytext FROM table1')?

2 个答案:

答案 0 :(得分:0)

我认为这是FireDac的错误。

我在uADPhysSQLite.pas单元的ADSQLiteTypeName2ADDataType过程中更改了以下行

SetLen(AOptions.FormatOptions.MaxStringSize, False);
AType := dtAnsiString;

SetLen(AOptions.FormatOptions.MaxStringSize, True);
AType := dtWideString;

对于ABaseTypeName =' VARCHAR'

SELECT mytext FROM table0

在运行时返回正确的值。但是在设计时我们仍然有' ??????'。

但我不认为这是一个很好的解决方案。

答案 1 :(得分:0)

我相信您应该直接将参数类型设置为AsWideString:

Query.SQL.Text:='INSERT INTO table1 (mytext, publishdate) VALUES (:mytext,: publishdate);';
Query.Params[0].AsWideString := mytext;
Query.Params[1].AsDate := publishdate;
Query.ExecSQL;

参考:http://docwiki.embarcadero.com/RADStudio/Rio/en/Unicode_Support_(FireDAC)#Parameter_Values