Idealmente, un juego de caracteres adecuado debe ser definido a nivel del servidor, operación descrita en la sección » Configuración del juego de caracteres del manual del servidor MySQL. Alternativamente, cada API MySQL ofrece un método para definir el juego de caracteres durante la ejecución.
El juego de caracteres debe ser comprendido y definido, sabiendo que tiene un efecto en cada acción, y tiene implicaciones a nivel de seguridad. Por ejemplo, el mecanismo de escape (i.e. mysqli_real_escape_string() para mysqli, y PDO::quote() para PDO_MySQL) utilizará esta configuración. Es importante tener en cuenta que estas funciones no utilizarán el juego de caracteres definido con una consulta, por lo tanto, el ejemplo siguiente no tendrá ningún efecto sobre el juego de caracteres:
Ejemplo #1 Problemas al definir el juego de caracteres con SQL
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
// NO afectará $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");
// NO afectará $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");
// Pero esto afectará $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');
// Pero esto NO lo afectará (UTF-8 en comparación con utf8mb4) -- no utilice guiones aquí
$mysqli->set_charset('UTF-8');
?>
A continuación, los ejemplos que demuestran cómo modificar correctamente el juego de caracteres durante la ejecución utilizando cada una de las APIs.
Nota: Confusión posible con UTF-8
Debido a que los nombres de los juegos de caracteres en MySQL no contienen guiones, la cadena "utf8" es correcta en MySQL y definirá el juego de caracteres en UTF-8. La cadena "UTF-8" no es correcta, y utilizar "utf-8" fallará al modificar el juego de caracteres.
Ejemplo #2 Ejemplo de definición del juego de caracteres: mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
echo 'Juego de caracteres inicial: ' . $mysqli->character_set_name() . "\n";
if (!$mysqli->set_charset('utf8mb4')) {
printf("Error al cargar el juego de caracteres utf8mb4: %s\n", $mysqli->error);
exit;
}
echo 'Su juego de caracteres actual es: ' . $mysqli->character_set_name() . "\n";
?>
Ejemplo #3 Ejemplo de definición del juego de caracteres: pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>