使用Delphi Xe2和MySQL 5.1,如何从查询中返回UTF8字符串?

时间:2012-01-11 17:38:17

标签: mysql delphi utf-8

我正在开发一个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

2 个答案:

答案 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。