当在带有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')?
答案 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