PDO + MySQL和损坏的UTF-8编码

2022-08-30 11:54:46

我在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_encodejson_decode


答案 1

警告:这个答案适用于 PHP 5.3.5 及更低版本。请勿将其用于 PHP 版本 5.3.6(2011 年 3 月发布)或更高版本。

在这里与Palec的答案进行比较。


用:

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

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


答案 2

您必须为连接设置正确的字符集。charset=utf8 选项添加到 DSN(这是特定于 MySQL 的!

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName;charset=utf8',
    'username',
    'password'
);

但是,在 5.3.6(2011 年 3 月发布)之前的 PHP 版本中,必须使用解决方法,因为不支持 DSN 中的选项。charset

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

推荐