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.
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);
?>