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

Jas*_*ver 30 php mysql pdo character-encoding

我在PHP中使用带有MySQL数据库的PDO库,但如果我插入以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'));
Run Code Online (Sandbox Code Playgroud)

解决方法:使用json_encode函数在将数据插入数据库之前转换数据,并json_decode在获取后使用它进行解码.这就是我现在这样做的方式.

小智 128

它可能在几年前解决了,但为了后代的缘故:

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

它强制在pdo连接上使用UTF-8.为我工作.

  • 如果您有PDO :: MYSQL_ATTR_INIT_COMMAND =>'SET NAMES'UTF8'' - 请确保您没有添加: - > exec("SET CHARACTER SET utf8")... (2认同)

Pal*_*lec 52

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

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

但是,在5.3.6下的PHP版本中,必须使用解决方法,因为charset不支持选项.

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

  • 想要更新现有的,最高投票的答案,但[我的编辑被拒绝](https://stackoverflow.com/review/suggested-edits/3904725).因此将其作为新答案发布. (4认同)