working utf8 ut8 set_charset not mysql_query charset acentos php mysql pdo

utf8 - PHP PDO: juego de caracteres, ¿establecer nombres?



set charset ut8 mysqli (9)

$ con = nuevo PDO ("mysql: host = $ dbhost; dbname = $ database; charset = $ encoding ", "$ dbuser", "$ dbpassword");

Lo tenía previamente en mi conexión mysql_ * normal:

mysql_set_charset("utf8",$link); mysql_query("SET NAMES ''UTF8''");

¿Lo necesito para el PDO? ¿Y dónde debería tenerlo?

$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));


Antes de PHP 5.3.6, se ignoraba la opción de juego de caracteres. Si está ejecutando una versión anterior de PHP, debe hacerlo así:

<?php $dbh = new PDO("mysql:$connstr", $user, $password); $dbh -> exec("set names utf8"); ?>


Creo que necesita una consulta adicional porque la opción de juego de caracteres en el DSN se ignora. ver el enlace publicado en el comentario de la otra respuesta.

Mirando cómo Drupal 7 lo está haciendo en http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7 :

// Force MySQL to use the UTF-8 character set. Also set the collation, if a // certain one has been set; otherwise, MySQL defaults to ''utf8_general_ci'' // for UTF-8. if (!empty($connection_options[''collation''])) { $this->exec(''SET NAMES utf8 COLLATE '' . $connection_options[''collation'']); } else { $this->exec(''SET NAMES utf8'');

}


Esta es probablemente la forma más elegante de hacerlo.
Justo en la llamada al constructor de PDO, pero evitando la opción de juego de caracteres con errores (como se mencionó anteriormente):

$connect = new PDO( "mysql:host=$host;dbname=$db", $user, $pass, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ) );

Funciona muy bien para mi


Lo tendrá en su cadena de conexión como:

"mysql:host=$host;dbname=$db;charset=utf8"

SIN EMBARGO, antes de PHP 5.3.6, se ignoró la opción de juego de caracteres. Si está ejecutando una versión anterior de PHP, debe hacerlo así:

$dbh = new PDO("mysql:$connstr", $user, $password); $dbh->exec("set names utf8");


Para completar, en realidad hay tres maneras de configurar la codificación cuando se conecta a MySQL desde PDO y cuáles están disponibles dependen de su versión de PHP. El orden de preferencia sería:

  1. parámetro charset en la cadena DSN
  2. Ejecute SET NAMES utf8 con la opción de conexión PDO::MYSQL_ATTR_INIT_COMMAND
  3. Ejecute SET NAMES utf8 manualmente

Este código de ejemplo implementa los tres:

<?php define(''DB_HOST'', ''localhost''); define(''DB_SCHEMA'', ''test''); define(''DB_USER'', ''test''); define(''DB_PASSWORD'', ''test''); define(''DB_ENCODING'', ''utf8''); $dsn = ''mysql:host='' . DB_HOST . '';dbname='' . DB_SCHEMA; $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); if( version_compare(PHP_VERSION, ''5.3.6'', ''<'') ){ if( defined(''PDO::MYSQL_ATTR_INIT_COMMAND'') ){ $options[PDO::MYSQL_ATTR_INIT_COMMAND] = ''SET NAMES '' . DB_ENCODING; } }else{ $dsn .= '';charset='' . DB_ENCODING; } $conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options); if( version_compare(PHP_VERSION, ''5.3.6'', ''<'') && !defined(''PDO::MYSQL_ATTR_INIT_COMMAND'') ){ $sql = ''SET NAMES '' . DB_ENCODING; $conn->exec($sql); }

Hacer los tres es probablemente excesivo (a menos que esté escribiendo una clase que planea distribuir o reutilizar).


Probé este código y

$db=new PDO(''mysql:host=localhost;dbname=cwDB'',''root'','''', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $sql="select * from products "; $stmt=$db->prepare($sql); $stmt->execute(); while($result=$stmt->fetch(PDO::FETCH_ASSOC)){ $id=$result[''id'']; }


Solo quiero agregar que debes asegurarte de que tu base de datos se crea con COLLATE utf8_general_ci o con la intercalación que quieras usar, de lo contrario podrías terminar con otra distinta de la prevista.

En phpmyadmin puedes ver la recopilación haciendo clic en tu base de datos y seleccionando operaciones. Si intenta crear tablas con otra colación que su base de datos, sus tablas terminarán con la intercalación de la base de datos.

Así que asegúrese de que la intercalación de su base de datos sea correcta antes de crear tablas. Espero que esto salve a alguien unas horas lol


$con=""; $MODE=""; $dbhost = "localhost"; $dbuser = "root"; $dbpassword = ""; $database = "name"; $con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );