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

标签 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

最佳答案

当您为字段/表设置字符集时,通常这意味着确保数据存储时不会进行有损转换,使用适当的排序规则,并且一些编码也可以节省空间。例如,与 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/

相关文章:

PHP 变量未填充到表单上的 HTML 日期时间本地字段中

php - Yii CGridView BELONGS_TO 关系搜索 : Numeric comparison operator fails

mysql - Sql 到 Slick 的转换

SQL 更新(德尔福)

php - 在 PHP 中处理文件和 utf8

mysql substring/left 命令未返回正确的字符数

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

delphi - 是否可以捕获 Delphi 匿名方法/闭包的本地变量值?

php - 在没有 WSDL 的情况下将 PHP Soap 服务与 Delphi 一起使用?

tomcat - 奇怪的问题,Tomcat Webapp UTF-8 Character每次重启或每次重新部署后都无法正确显示