2010-12-17 13 views
18

Utilizo la biblioteca PDO con base de datos MySQL en PHP, pero si inserto cualquier dato codificado en UTF-8, como palabras en árabe, se inserta en la base de datos pero como ?????????.PDO + MySQL y codificación UTF-8 rota

En mi propio marco, después de crear la conexión PDO, envío dos consultas: SET NAMES utf8 y SET CHARACTER SET utf8. Todavía no funciona.

Ejemplo:

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')); 

Solución: Use la función json_encode para convertir los datos antes de insertarlo en la base de datos, y utilizar json_decode para decodificar después de ir a buscar. Así es como lo hago ahora.

+0

¿Estás seguro de que esto no es un problema de PHP? Asegúrese de tener mbstring instalado? – Rahly

+0

Sugiero que envíe de vuelta la misma cadena y compruebe si llega bien. Solo como una prueba. – s3v3n

+0

¿qué es el valor de confitem ('database', 'charset')? –

Respuesta

104

Ha sido probablemente resuelto hace años, pero por el bien de las generaciones futuras:

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

Obliga UTF-8 en la conexión PDO. Trabajó para mi.

+1

si tiene PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES' UTF8 '' - asegúrese de no haber agregado: -> exec ("SET CHARACTER SET utf8") ... – Jeffz

2

Intente establecer el valor default_charset en php.ini para UTF-8. O puede configurarlo utilizando la función ini_set.

Además, si la entrada proviene de envíos de formularios, asegúrese de que sus páginas web estén configuradas en UTF-8 con la metaetiqueta.

+0

hola, vale, lo intentaré, pero no necesito esta solución, quiero resolverlo desde mi script :)? – Jason4Ever

+0

sí ... Probé los datos provenientes de las páginas web, sí que vienen con codificación de utf-8, y hay una metaetiqueta de codificación utf-8 – Jason4Ever

+0

. Acabo de tener el mismo problema en la máquina de Windows, y esta fue la solución al problema. Todo estaba hablando UTF-8 ... excepto PHP. – v010dya

33

Debe establecer el juego de caracteres correcto para la conexión. Add charset=utf8 option to the DSN. (Esto es específico de MySQL!)

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

Sin embargo, en las versiones de PHP bajo 5.3.6, debe utilizar una solución alternativa como charset opción no es compatible.

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

Quería actualizar la respuesta existente, más votada, pero [mi edición fue rechazada] (https://stackoverflow.com/review/suggested-edits/3904725). Por lo tanto publicarlo como una nueva respuesta. – Palec

+0

¡Gracias! 'charset = utf8'' Trabajo para mí en el lado del servidor de Datatable – mghhgm

+0

¡Gracias por esto! charset = utf8 fue lo que solucionó este problema tan molesto para mí también. – Brigante

1

Todos los intentos gusta:

PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' " 

o

$this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt); 

o

$this->connection->exec("set names utf8"); 

siendo generada texto lío ilegible.

En mi caso, la causa del problema era: htmlentities utilizado antes de insertar datos en una base de datos. Las letras cirílicas se destruyeron por completo.