Conceptos
PHP Manual

Conjuntos de caracteres

De forma ideal, un conjunto de caracteres apropiado será establecido a nivel del servidor, que está descrito dentro de la sección » Configuración del conjunto de caracteres del manual del Servidor MySQL. De forma alternativa, cada API de MySQL ofrece métodos para establecer el conjunto de caracteres en tiempo de ejecución.

Precaución

El conjunto de caracteres y el escape de caracteres

El conjunto de caracteres debería entenderse y ser definido, ya que afecta a cada acción, e incluye implicaciones de seguridad. Por ejemplo, el mecanismo de escape (p.ej., mysqli_real_escape_string() para mysqli, mysql_real_escape_string() para mysql, y PDO::quote() para PDO_MySQL) cumplirá con esta configuración. Es importante darse cuenta que estas funciones no usarán el conjunto de caracteres que está definido en una consulta, por lo que, por ejemplo, lo siguiente no tendrá efecto sobre ellas:

Ejemplo #1 Problemas al establecer el conjunto de caracteres con SQL

<?php

$mysqli 
= new mysqli("localhost""mi_usuario""mi_contraseña""world");

// No afectará a $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8");

// No afectará a $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8");

// Pero esto sí afectará a $mysqli->real_escape_string();
$mysqli->set_charset('utf8'));

?>

Abajo hay ejemplos que demuestran cómo alterar adecuadamente el conjunto de caracteres en tiempo de ejecución usando cada API.

Ejemplo #2 Ejemplo para establecer el conjunto de caracteres: mysqli

<?php

$mysqli 
= new mysqli("localhost""mi_usuario""mi_contraseña""world");

if (!
$mysqli->set_charset('utf8')) {
    
printf("Error cargando el conjunto de caracteres utf8: %s\n"$mysqli->error);
} else {
    
printf("Conjunto de caracteres actual: %s\n"$mysqli->character_set_name());
}

print_r$mysqli->get_charset() );

?>

Ejemplo #3 Ejemplo para establecer el conjunto de caracteres: pdo_mysql

Nota: Esto sólo funciona a partir de PHP 5.3.6.

<?php
$pdo 
= new PDO("mysql:host=localhost;dbname=world;charset=utf8"'mi_usuario''mi_contraseña');
?>

Ejemplo #4 Ejemplo para establecer el conjunto de caracteres: mysql

<?php

$conexión 
mysql_connect("localhost""mi_usuario""mi_contraseña");
$bd   mysql_select_db("world");

if (!
mysql_set_charset('utf8'$conexión)) {
    echo 
"Error: No se pudo establecer el conjunto de caracteres.\n";
    exit;
}

echo 
'El conjunto de caracteres actual es: ' .  mysql_client_encoding($conexión);

?>

Conceptos
PHP Manual