【问题标题】:Encoding troubles converting MySQL to Mongo with PHP使用 PHP 将 MySQL 转换为 Mongodb 的编码问题
【发布时间】:2016-01-23 21:18:46
【问题描述】:

我在使用 PHP/Mongo 时遇到了很多编码问题。

现在,我正在将一些数据从 MySQL 转换为 Mongo。我有一个包含é 的字符串,但是当我尝试将其编码为 UFT-8(通过mb_convert_encodinguft8_encode)时,它变成了é。我确定其他字符串也包含其他重音字符。

我试过mb_detect_encoding,它告诉我字符串是UTF-8,但是当我做mb_check_encoding($string, 'UTF-8')时,它返回false。

基本上,我不知道出了什么问题。这是在一个只是 PHP 脚本的页面上,没有 HTML。对这个问题有什么建议,或者在插入 Mongo 时一般保持字符编码?

这里是有问题的脚本:https://plnkr.co/edit/eAkLxfklzLNCsZTBPKsX

MySQL 表使用 MyISAM 引擎,字符集 utf8,排序规则 utf8_unicode_ci

【问题讨论】:

  • 您是说它“在一个只是 PHP 脚本的页面上”,但它仍然被浏览器使用?你检查过你的 HTML 内容描述符吗?
  • 抱歉,我不太清楚你的意思。我确实在顶部设置了header('Content-type: text/plain; charset=utf-8');
  • 好的,你能告诉我们你的 PHP 脚本吗?另一个问题可能是 Mongo 与 MySQL 的设置方式。
  • 添加脚本和 MySQL 表设置
  • 因此é 是普通文本阅读器读取的正确 UTF 编码 - 任何扩展的 ASCII 字符都将转换为两个字节而不是一个字节 é。我不认为 MySQL 的导出不正确 - 它包含正确的 UTF-8 值。它必须是您的 MongoDB 导入。我实际上没有看到您在 PHP 脚本中初始化 mongo 数据库的位置 - 也许您需要在那里显式指定您的编码参数?

标签: php mysql mongodb encoding utf-8


【解决方案1】:
  • 不要使用 mysql_* API;改成mysqli_*

  • 不要使用任何 mb 或 utf8 编码/解码例程;他们只是隐藏了“正确”的解决方案。

  • 连接mysql后,立即执行SET NAMES utf8

  • SHOW CREATE TABLE -- 验证表/列是CHARACTER SET utf8(或utf8mb4)

éé 的 Mojibake。它通常表示latin1 设置和utf8 设置不匹配。

如果使用 PDO:$db = new PDO('dblib:host=host;dbname=db;charset=UTF8', $user, $pwd); 执行SET NAMES utf8

【讨论】:

  • 我没有使用 mysql_* API;使用 PDO。我会用它试试SET NAMES utf8
  • 我添加了关于 PDO 的注释。
  • 如上所述,所有的列都是utf8_unicode_ci,所以我明天上班试试charset。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
相关资源
最近更新 更多