我正在开发一个 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
最佳答案
当您为字段/表设置字符集时,通常这意味着确保数据存储时不会进行有损转换,使用适当的排序规则,并且一些编码也可以节省空间。例如,与 UTF-16 相比,UTF-8 将有效地存储英语字符串(和大多数西方语言),并且在使用其他语言时效率会越来越低。 通常,驱动程序 - 如果设置正确 - 会将字符串从数据库字符集转换为客户端应用程序字符集。你没有说你用什么来访问 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 has the following MYSQL data type mappings:
char TDBXDataTypes.WideStringType if the server uses UTF-8; otherwise TDBXDataTypes.AnsiStringType
varchar TDBXDataTypes.WideStringType if the server uses UTF-8; otherwise TDBXDataTypes.AnsiStringType
因此,如果服务器使用 UTF-8,dbExpress 应该以 Delphi UTF-16 格式处理数据,否则以 ANSI 编码格式处理数据。您的应用程序返回哪种 TField?
关于mysql - 使用 Delphi Xe2 和 MySQL 5.1,如何从查询中返回 UTF8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823942/