Delphi,dbExpress和UTF8

时间:2014-01-28 17:04:43

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

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

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

新数据库已设置为默认排序规则为 utf8-general-ci 。 这些表格已经与原始整理一起迁移为 latin1-swedish-ci

目前我们所有的应用程序都使用TSQLConnection.ServerCharSet = ""读取,因为将读取连接设置为 utf8 会产生意外结果。

我们使用设置为TSQLConnection.ServerCharSet = "utf8"

的连接进行编写

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

然而,当我在新服务器上测试时,它仍然不顺畅:

  • 将读取连接设置为 utf8 会以某种形式的汉字传递结果。
  • 将读取连接设置为 utf8-general-ci “”正确读取。
  • 将写入连接设置为“”会在写入“£”或“€”字符时产生垃圾
  • 将写入连接设置为 utf8 正确写入

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

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

我们有什么方法可以避免为读/写例程设置2个独立的TSQLConnection?

修改

根据 Arioch'的建议,我运行了不同字符串列类型的测试。我们一直在使用Text / Tinytext字段,这就是我们遇到问题的地方。

使用VarChar列类型时,不会发生问题。

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

1 个答案:

答案 0 :(得分:1)

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

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

这又导致了这个Embarcadero页面:

dbExpress Data Type Mapping for Supported Databases

其中找到了答案:

text TDBXDataTypes.AnsiStringType

即。阅读AsAnsiString而不是AsString