【问题标题】:How to set utf8 character set in magento core resource?如何在 magento 核心资源中设置 utf8 字符集?
【发布时间】:2015-12-12 00:32:03
【问题描述】:

我正在从 API 响应中导入批量产品。此批量产品导入将使用核心资源连接的 mysql 查询处理大量数据更新。

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

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

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

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

这些特殊字符在直接更新时不会用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 值转换添加/修改什么。

任何帮助都非常感谢!

【问题讨论】:

    标签: php mysql magento utf-8 special-characters


    【解决方案1】:

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

    创建数据库后,需要运行以下 sql 查询:

    ALTER DATABASE DB_NAME 默认字符集 utf8 COLLATE utf8_general_ci;

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

    【讨论】:

      【解决方案2】:

      Ä 是 utf8 的 Mojibake Ä

      Mojibake 通常发生在

      • 客户端中的字节已正确编码为 utf8(良好)。
      • 您可能默认连接到SET NAMES latin1(或set_charset('latin1') 或...)。 (应该是utf8。)
      • xx 表中的列被声明为CHARACTER SET latin1。 (或者它可能是从表/数据库继承的。)(应该是utf8。)
      • 表格中的列可能是CHARACTER SET utf8,也可能不是,但应该是这样。

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

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

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

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

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

      C383 E2809E 被存储

      这可能就是这样发生的。结果是“双重编码”,而不是“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);
      

      【讨论】:

      • 谢谢!只是为了重新迭代,使用本机适配器保存很好,但通过 SQL 保存到数据库中会产生问题。通过 SQL 保存时,名称为“GÄNGTAPP H320-4 M8X1 6H”,而使用本机适配器时,名称为“GÄNGTAPP H320-4 M8X1 6H”。 “GÄNGTAPP H320-4 M8X1 6H”对应的十六进制代码是“47C383E2809E4E475441505020483332302D34204D38583120...”(对不起,我不得不举一个不同的例子)请建议我接下来应该做什么。 :)
      • 我还验证了schema、table以及column的字符集都是utf8。
      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2011-05-23
      相关资源
      最近更新 更多