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'));
// Y esto NO le afectará (utf-8 frente a utf8) -- no emplee guiones aquí
$mysqli->set_charset('utf-8');
?>
Abajo hay ejemplos que demuestran cómo alterar adecuadamente el conjunto de caracteres en tiempo de ejecución usando cada API.
Nota: Posible confusión con UTF-8
Debido a que los nombres de los conjuntos de caracteres no contienen guiones, la cadena "utf8" es válida en MySQL para establecer el conjunto de caracteres a UTF-8. La cadena "utf-8" no es válida para cambiar el conjunto de caracteres.
Ejemplo #2 Ejemplo para establecer el conjunto de caracteres: mysqli
<?php
$mysqli = new mysqli("localhost", "mi_usuario", "mi_contraseña", "world");
printf("Conjunto de caracteres inicial: %s\n", $mysqli->character_set_name());
if (!$mysqli->set_charset('utf8')) {
printf("Error cargando el conjunto de caracteres utf8: %s\n", $mysqli->error);
exit;
}
echo "Información del nuevo conjunto de caracteres:\n";
print_r( $mysqli->get_charset() );
?>
Ejemplo #3 Ejemplo para establecer el conjunto de caracteres: pdo_mysql
Nota: 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");
echo 'Conuunto de caracteres inicial: ' . mysql_client_encoding($conexión) . "\n";
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);
?>