PDO + MySQL и сломанная кодировка UTF-8
Я использую библиотеку 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
для декодирования после выборки. Вот как я это делаю сейчас.
Ответы
Ответ 1
Использование:
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName',
'username',
'password',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
Это заставляет UTF-8 на соединении PDO. Это сработало для меня.
Ответ 2
Вы должны установить правильный набор символов для соединения. Добавьте опцию 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")
);
Ответ 3
Попробуйте установить значение default_charset
в php.ini для UTF-8. Или вы можете установить его с помощью функции ini_set.
Кроме того, если вход поступает через представления формы, убедитесь, что ваши веб-страницы установлены в UTF-8 с помощью метатега.
Ответ 4
Все попытки:
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
, использованная до вставки данных в базу данных.
Кириллические буквы полностью уничтожены.