PDO MySQL 和损坏的 UTF-8 编码

新手上路,请多包涵

我在 PHP 中将 PDO 库与 MySQL 数据库一起使用,但如果我插入任何以 UTF-8 编码的数据,例如阿拉伯语单词,它就会插入到数据库中,但会以 ????????? 的形式插入。

在我自己的框架中,创建 PDO 连接后,我发送了两个查询 – SET NAMES utf8SET CHARACTER SET utf8 。它仍然不起作用。

例子:

 loadclass('PDO', array(
    sprintf(
        'mysql:host=%s;port=%s;dbname=%s',
        confitem('database', 'host'),
        confitem('database', 'port'),
        confitem('database', 'name')
    ),
    confitem('database', 'username'),
    confitem('database', 'password'),
    array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect'))
));
$this->query('SET NAMES ' . confitem('database', 'charset'));
$this->query('SET CHARACTER SET ' . confitem('database', 'charset'));

解决方法:使用 json_encode 函数在插入数据库之前转换数据,并在提取后使用 json_decode 解码。这就是我现在的做法。

原文由 Jason4Ever 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 428
2 个回答

警告: 此答案适用于 PHP 5.3.5 及更低版本。不要将它用于 PHP 版本 5.3.6(2011 年 3 月发布)或更高版本。

在这里 与帕莱克的答案 进行比较。


利用:

 $pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

它在 PDO 连接上强制使用 UTF-8。它对我有用。

原文由 shark555 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试将 php.ini 中的 default_charset 值设置为 UTF-8。或者您可以使用 ini_set 函数进行设置。

此外,如果输入来自表单提交,请确保您的网页使用元标记设置为 UTF-8。

原文由 Burak Guzel 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题