A opção
character_set_client
é o que o MySQL usa para o conjunto de caracteres de consultas e dados que o cliente envia. O padrão é utf8 no MySQL 5.5, 5.6 e 5.7 e utf8mb4 no 8.0.
Ele também pode ser alterado globalmente em seu arquivo de opções my.cnf ou por sessão por um DEFINIR NOMES declaração.
É bom definir a opção explicitamente ao se conectar, para que você não precise assumir seu valor padrão.
Re seu comentário:
Receio que você esteja confundindo dois casos diferentes de injeção de SQL. Existe um risco ao usar esses cinco conjuntos de caracteres específicos, mas não está relacionado à injeção de SQL de segunda ordem.
O risco do conjunto de caracteres é devido a alguns conjuntos de caracteres de vários bytes. É comum inserir uma barra invertida para escapar de um caractere de aspas literal. Mas em alguns conjuntos de caracteres, o byte de barra invertida é mesclado no byte anterior, formando um caractere de vários bytes. Isso deixa a citação sem escape.
A injeção de SQL de segunda ordem é totalmente diferente. Pode ocorrer com qualquer conjunto de caracteres. É quando um invasor adiciona dados ao seu banco de dados por meios legítimos, como o preenchimento de um formulário. A inserção dos dados é tratada sem erros. Mas os valores que eles inserem contêm sintaxe projetada para explorar alguma consulta SQL posterior.
Ele se baseia em desenvolvedores acreditando que os dados que já foram salvos com segurança em seu banco de dados são de alguma forma "seguros" para uso sem a parametrização adequada.
Um exemplo de injeção de SQL de segunda ordem que é meramente acidental em vez de maliciosa pode ser que uma pessoa tenha o sobrenome "O'Reilly" e o nome seja lido pelo código e usado em uma consulta subsequente.
$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";
Se o nome contiver um apóstrofo literal, isso atrapalharia a segunda consulta nesse exemplo.