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