【问题标题】:Delphi, dbExpress and UTF8Delphi、dbExpress 和 UTF8
【发布时间】:2014-01-28 17:04:43
【问题描述】:

我们刚刚将 MySQL 服务器从 5.0 升级到 5.1。

剩下的任务是最终解决我们的 Unicode 支持问题,自 Delphi 2010 以来一直困扰着我们。我们现在使用 XE5。

新数据库已设置为默认排序规则 utf8-general-ci。 这些表已迁移,其原始排序规则为 latin1-swedish-ci

目前,由于将读取连接设置为 utf8,我们所有使用 TSQLConnection.ServerCharSet = "" 读取的应用程序都出现了意外结果。

我们将连接设置为TSQLConnection.ServerCharSet = "utf8"

我现在已经制作了新架构的本地副本并将所有表转换为 utf8-general-ci - 这看起来进展顺利。

但是,当我在新服务器上测试时,它仍然不顺利:

  • 将读取连接设置为 utf8 会以某种汉字形式提供结果。
  • 将读取连接设置为 utf8-general-ci"" 读取正确。
  • 将写入连接设置为 "" 会导致写入“£”或“€”字符时出现垃圾
  • 将写入连接设置为 utf8 写入正确

我怀疑 utf8-general-ci 没有被 dbExpress 识别为选项,因此被忽略了

我还怀疑 SQLConnection.Locale 设置可能是一个问题 - 目前设置为 0000,但我尝试将其设置为 LOCALE_SYSTEM_DEFAULT (2048) 没有成功...

有什么方法可以避免为读/写例程使用 2 个单独的 TSQLConnections?

编辑

根据 Arioch 'The 的建议,我使用不同的字符串列类型进行了测试。我们一直在使用 Text/Tinytext 字段,而这正是我们发现问题的地方。

使用 VarChar 列类型时不会出现问题

我们想要一个不要求我们使用第三方驱动程序/连接的建议,因为该举措不符合我们当前的发展战略

【问题讨论】:

  • 您是否尝试过其他供应商的 MySQL DBX 驱动程序?
  • 否 - 目前只有 Embarcadero 提供。
  • 尝试它们,即使只是为了“分而治之”的错误二进制搜索
  • Devart MySQL 驱动程序使用“使用 Unicode”检查读写...
  • 你也不知道你读什么写什么,char,varchar,blob?不知道 MariaDB 和 FirebirdSQL 有何不同

标签: mysql delphi utf-8 delphi-xe5 dbexpress


【解决方案1】:

Arioch 'The 的最终评论让我找到了这个问题:

With Delphi Xe2 and MySQL 5.1, how return UTF8 string from query?

这又会导致这个 Embarcadero 页面:

dbExpress Data Type Mapping for Supported Databases

答案在哪里找到:

文本 TDBXDataTypes.AnsiStringType

即阅读AsAnsiString 而不是AsString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多