PDO + MySQL and broken UTF-8 encoding

前端 未结 4 983
孤独总比滥情好
孤独总比滥情好 2020-11-29 22:55

I use the PDO library with a MySQL database in PHP, but if I insert any data encoded in UTF-8, like Arabic words, it’s inserted into the database, but as ?????????

相关标签:
4条回答
  • 2020-11-29 23:31

    Try setting the default_charset value in php.ini to UTF-8. Or you can set it using the ini_set function.

    Also, if the input is coming through form submissions, make sure your web pages are set to UTF-8 using the meta tag.

    0 讨论(0)
  • 2020-11-29 23:37

    Use:

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

    It forces UTF-8 on the PDO connection. It worked for me.

    0 讨论(0)
  • 2020-11-29 23:51

    You have to set the correct character set for the connection. Add the charset=utf8 option to the DSN (this is MySQL-specific!)

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

    However, in PHP versions before 5.3.6, you must use a workaround as the charset option is not supported.

    $pdo = new PDO(
        'mysql:host=hostname;dbname=defaultDbName',
        'username',
        'password',
        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
    );
    
    0 讨论(0)
  • 2020-11-29 23:54

    All attempts like:

    PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "
    

    or

    $this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt);
    

    or

    $this->connection->exec("set names utf8");
    

    still generated unreadable text mess.

    In my case, the cause of the problem was: htmlentities used prior to inserting data into a database. Cyrillic letters were destroyed completely.

    0 讨论(0)
提交回复
热议问题