PDO + MySQL и неработающая кодировка UTF-8 - PullRequest
25 голосов
/ 18 декабря 2010

Я использую библиотеку 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 для декодированияпосле получения.Вот как я это делаю сейчас.

Ответы [ 4 ]

121 голосов
/ 11 августа 2011

Использование:

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

Вызывает UTF-8 на соединении PDO. У меня это сработало.

40 голосов
/ 27 января 2014

Вы должны установить правильный набор символов для соединения. Добавить параметр charset=utf8 к DSN (это зависит от MySQL!)

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

Однако в версиях PHP до 5.3.6 вы должны использовать обходной путь в качестве *Параметр 1007 * не поддерживается.

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
3 голосов
/ 13 мая 2016

Все попытки, такие как:

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 используется перед вставкой данных в базу данных. Буквы кириллицы полностью уничтожены.

2 голосов
/ 18 декабря 2010

Попробуйте установить значение default_charset в php.ini в UTF-8. Или вы можете установить его, используя функцию ini_set .

Кроме того, если вход поступает через отправку формы, убедитесь, что для ваших веб-страниц задано UTF-8 с использованием метатега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...