如何在 magento 核心资源中设置 utf8 字符集?

How to set utf8 character set in magento core resource?

我正在处理来自 API 的批量产品导入 response.This 批量产品导入将使用 mysql 查询核心资源连接来处理大量数据更新。

所以在这种情况下,系统将从 Api 响应中接收到一些特殊字符,这些特殊字符应该如下所示。

[Name] => GÄNGT M8X0.75 6H

我们需要保存这个值应该像GÄNGT M8X0.75 6H

由于批量更新的原因,我们使用直接更新查询来访问 mysql 数据库,而不是使用本机 magento 适配器。

这些特殊字符在直接执行 update.But 时不会通过 utf8 转换更新,如果我们使用 magento 产品导入适配器,它将转换并保存为 mysql 数据库中的值。

我试过在magento核心资源集合中添加set character_set_results=utf8,但是没有成功。

以下是我的试用:

$resource = Mage::getSingleton('core/resource');
$writeConnection = $resource->getConnection('core_write');
$writeConnection->query("set character_set_results=utf8"); 
$writeConnection->query($mysqlUpdateQuery);
$writeConnection->closeConnection();

任何人都可以帮助我,哪里出了问题或我想为 utf8 值转换添加/修改什么。

非常感谢任何帮助!

Ä 是 utf8 的 Mojibake Ä.

通常 Mojibake 发生在

  • 您在客户端中的字节已正确编码为 utf8(良好)。
  • 您连接的是 SET NAMES latin1(或 set_charset('latin1') 或...),可能是默认连接。 (应该是utf8。)
  • xx table 中的列已声明为 CHARACTER SET latin1。 (或者可能是继承自 table/database。)(应该是 utf8。)
  • table 中的列可能是也可能不是 CHARACTER SET utf8,但应该是。

鉴于这些似乎与你所说的不一致,让我们进一步挖掘。请提供

SELECT col, HEX(col) FROM ... WHERE ...

GÄNGT M8X0.75 6H,如果正确存储在utf8中将有十六进制47 C384 4E4754204D3858302E3735203648(我加了空格);
如果存储不正确(以一种方式),十六进制将为 47 C383 E2809E 4E4754204D3858302E3735203648.

你看到其中任何一个吗?还是第三个十六进制?

有了这个答案,我们就可以着手计划纠正措施了。

C383 E2809E被存储

大概是这样。结果是 "double-encoding",而不是 "Mojibake"。

  • 客户端有 C384Ä 的正确 utf8 编码。
  • 初始化被错误地设置为 latin1。这需要改变。请注意,您有 $writeConnection->query("set character_set_results=utf8");,它只处理 output 端,而不是 input 端。阅读 SET NAMES。将其更改为 $writeConnection->query("SET NAMES utf8");
  • 该列已正确声明 CHARSET utf8

修复数据:

UPDATE tbl SET name = CONVERT(BINARY(
                        CONVERT(name USING latin1))
                      USING utf8);

在 magento 中设置 utf8_general_ci Mysql 数据库字符集

创建数据库后,您需要运行这个sql查询:

改变数据库DB_NAME默认字符集utf8整理utf8_general_ci;

其中 DB_NAME 是您的数据库名称。