Conjuntos de caracteres
Idealmente, um conjunto de caracteres adequado será definido no nível do servidor, e isso é descrito na seção » Configuração do conjunto de caracteres do manual do servidor MySQL. Alternativamente, cada API MySQL oferece um método para definir o conjunto de caracteres em tempo de execução.
O conjunto de caracteres e escape de caracteres
O conjunto de caracteres deve ser entendido e definido, pois afeta todas as ações e inclui implicações de segurança. Por exemplo, o mecanismo de escape (por exemplo, mysqli_real_escape_string() para mysqli e PDO::quote() para PDO_MySQL) irá aderir a esta configuração. É importante perceber que essas funções não usarão o conjunto de caracteres definido com uma consulta, portanto, por exemplo, o seguinte não terá efeito sobre elas:
Example #1 Problemas ao definir o conjunto de caracteres com SQL
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
// Não afetará $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");
// Não afetará $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");
// Mas isto afetará $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');
// Porém, isto NÃO irá afetá-la (UTF-8 vs utf8mb4) -- não use hífens aqui
$mysqli->set_charset('UTF-8');
?>
Abaixo estão exemplos que demonstram como alterar adequadamente o conjunto de caracteres em tempo de execução usando cada API.
Note: Possível confusão UTF-8
Como os nomes dos conjuntos de caracteres no MySQL não contêm hífens, a string "utf8" é válida no MySQL para definir o conjunto de caracteres como UTF-8 (codificação Unicode UTF-8 de até 3 bytes). A string "UTF-8" não é válida, pois o uso de "UTF-8" não alterará o conjunto de caracteres e gerará um erro.
Example #2 Exemplo de definição do conjunto de caracteres: mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
echo 'Conjunto de caracteres inicial: ' . $mysqli->character_set_name() . "\n";
if (!$mysqli->set_charset('utf8mb4')) {
printf("Erro ao carregar o conjunto de caracteres utf8mb4: %s\n", $mysqli->error);
exit;
}
echo 'Seu conjunto de caracteres atual é: ' . $mysqli->character_set_name() . "\n";
?>
Example #3 Exemplo de definição do conjunto de caracteres: pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>