我正在从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值转换添加/修改什么。
任何帮助,非常感谢!
Ä
是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");
,它只处理输出端,而不处理输入端。阅读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查询:
ALTER DATABASE DB_NAME
默认字符集utf8 COLLATE utf8_general_ci;