如何在 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 是您的数据库名称。
我正在处理来自 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 是您的数据库名称。