我正在从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值转换。
任何帮助很多赞赏!
答案 0 :(得分:2)
Ä
是utf8 Ä
的Mojibake。
通常在
时发生MojibakeSET NAMES latin1
(或set_charset('latin1')
或...)相关联。 (应该是utf8
。)CHARACTER SET latin1
。 (或者它可能是从表/数据库继承的。)(应该是utf8
。)CHARACTER SET utf8
,也可能不是SELECT col, HEX(col) FROM ... WHERE ...
,但应该是这样。由于这些似乎不同意你所说的,让我们进一步挖掘。请提供
GÄNGT M8X0.75 6H
47 C384 4E4754204D3858302E3735203648
,如果正确存储在utf8中,则会有47 C383 E2809E 4E4754204D3858302E3735203648
(我添加空格);
如果存储不正确(以一种方式),则十六进制将为C384
。
你看到其中任何一个吗?还是第三个十六进制?
有了这个答案,我们就可以着手制定纠正措施。
C383 E2809E已存储
这可能就是这样发生的。结果是“双重编码”,而不是“Mojibake”。
Ä
,latin1
的正确utf8编码。$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);
。修复数据:
class myclass { /* whatever attributes, methodes */ };
list<myclass *> lst (5); //5 pointers will be NULL this way
for (list<myclass *>::iterator it=lst.begin(); it != lst.end(); it++) {
myclass *obj= *it;
delete obj; //error
it = lst.erase(it);
}
答案 1 :(得分:0)
在magento中设置utf8_general_ci Mysql数据库字符集,如下所示
创建数据库后,需要运行此sql查询:
ALTER DATABASE DB_NAME
默认字符集utf8 COLLATE utf8_general_ci;
DB_NAME是您的数据库名称。