Я использую библиотеку PDO с базой данных MySQL в PHP, но если я вставляю какие-либо данные, закодированные в UTF-8, например арабские слова, они вставляются в базу данных, но как ?????????  , 
  В моих собственных рамках после создания PDO-соединения я отправляю два запроса – SET NAMES utf8 и SET 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 для декодирования после извлечения.  Вот как я это делаю сейчас. 
Вероятно, это было решено много лет назад, но для будущих поколений:
 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); 
Он заставляет UTF-8 подключаться к pdo. Работал для меня.
  Вы должны установить правильную кодировку для соединения.  Добавьте charset=utf8 в DSN.  (Это зависит от MySQL!) 
 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName;charset=utf8', 'username', 'password' ); 
  Однако в PHP-версиях под 5.3.6 вы должны использовать обход, поскольку опция charset не поддерживается. 
 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); 
  Попробуйте установить значение default_charset в php.ini для UTF-8.  Или вы можете установить его с помощью функции ini_set . 
Кроме того, если вход поступает через представления формы, убедитесь, что ваши веб-страницы настроены на UTF-8, используя метатег.
Все попытки:
 PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' " 
или
 $this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt); 
или
 $this->connection->exec("set names utf8"); 
все еще генерируется нечитаемый текстовый беспорядок.
  В моем случае причиной была проблема: htmlentities используемые до вставки данных в базу данных.  Кириллические буквы были полностью уничтожены.