我正在将D7程序升级到XE,在Delphi 7下我有这样的代码......
ParamByName('Somefield')。AsString:= someutf8rawbytestring;
在XE下如果someutf8rawbytestring包含像西里尔字母这样的unicode字符,那么它们会显示为????在DB。
我看到someutf8rawbytestring是8个字符长,对于我的4个字符串,这是正确的。但在DB中只有四个字符。
我正在使用Firebird 2通过TIBQuery和XE并更新字符类型为“NONE”的Varchar字段。
所以它看起来像是在检测utf8并以某种方式转换回unicode数据点,然后这就是DB的字符串转换失败。我已经尝试将varchar字段设置为UTF8编码,但结果相同。
那应该如何处理?
编辑:我可以使用数据库工具并编辑我的数据库字段以获得一些非ASCII数据,当我读回它时,它作为utf8编码的字符串,我可以使用UTF8decode并且它是正确的。但是如果没有得到一堆????,将数据写回这个领域似乎是不可能的。在DB中。我试过ParamByName('Somefield')。AsString:= somewidestring;和ParamByName('Somefield')。AsWideString:= somewidestring;而我只是在DB中得到垃圾......
EDIT2:这是代码(在一次迭代中)......
procedure TFormnameEdit.savename(id : integer);
begin
With DataModule.UpdateNameQuery do begin
ParamByName ('Name').AsString:=UTF8Encode(NameEdit.Text);
ParamByName ('ID').AsInteger:=id;
ExecSQL;
Transaction.Commit;
end;
end;
答案 0 :(得分:2)
正如@Lightbulb建议的那样,将lc_ctype = UTF8添加到TIBDatabase params解决了这个问题。