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.

Caution

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