PDO + MySQL and broken UTF-8 encoding
Warning: This answer applies to PHP 5.3.5 and lower. Do not use it for PHP version 5.3.6 (released in March 2011) or later.
Compare with Palec's answer here.
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.
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 (released in March 2011), you must use a workaround as the charset
option in the DSN is not supported.
$pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
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.