我正在开发一个DataSnap服务器,它对db MySQL 5.1进行了一些查询,表格是UTF8,我在表格中看到了正确的拉丁文,中文,日文,俄文,希腊文,印地文文字。
查询表格时,我收到“????? ...”作为回复。
我设置了名称UTF8:
SQLConnection1.Connected:= True;
SQLConnection1.ExecuteDirect('set names utf8;');
然后我这样做:
with DMMySQL.SQLDataSet1 do
begin
if Locate('COD_GOOGLE', LanguageValue, []) then
Result:= UTF8Decode(FieldByName('DESCRIPTION').AsString); //
end;
和结果总是“????? ....”有或没有UTF8Decode
。
我哪里错了?
TIA
答案 0 :(得分:1)
为字段/表设置字符集时,通常这是为了确保存储数据而不进行有损转换,使用正确的排序规则,并且某些插入也可以节省空间。例如,UTF-8将有效地存储英语字符串(和大多数西方语言),与UTF-16相比,其他语言的效率将越来越低。 通常,驱动程序 - 如果设置正确 - 将字符串从数据库字符集转换为客户端应用程序字符集。你没有说你用什么来访问MySQL(dbExpress?ODBC?其他?)。因为Delphi Unicode字符串是UTF-16,我想默认情况下驱动程序会告诉MySQL将数据转换为Delphi使用的UTF-16转换数据,无论用什么编码将它们存储在MYSQL表中。 如果你告诉MySQL以UTF-8返回数据,并且驱动程序或Delphi数据库代码仍然将这些数据存储到UTF-16字符串中而不进行转换,则不会得到预期的结果。 如果您没有设置字符集或使用UTF-16编码会发生什么?
更新:RAD Studio帮助说(ms-help://embarcadero.rs2010/rad/DbExpress_Data_Type_Mapping_for_Supported_Databases.html和http://docwiki.embarcadero.com/RADStudio/en/DbExpress_Data_Type_Mapping_for_Supported_Databases#MYSQL):
dbExpress具有以下MYSQL数据类型映射:
char TDBXDataTypes.WideStringType如果服务器使用UTF-8;除此以外 TDBXDataTypes.AnsiStringType
varchar TDBXDataTypes.WideStringType如果服务器使用UTF-8;否则TDBXDataTypes.AnsiStringType
因此,如果服务器使用UTF-8,则dbExpress应处理Delphi UTF-16中的数据,否则采用ANSI编码。你的应用程序返回什么样的TField?
答案 1 :(得分:0)
你试过FieldByName('unicodefield').AsWideString
吗? IIRC dbExpress使用AsString返回AnsiString。