Aqui está uma resposta dois em um.
Você pode definir isso no DSN ou como MYSQL_ATTR_INIT_COMMAND (opções de conexão).
DSN é melhor, eu acho.
$connect = new PDO(
"mysql:host=$host;dbname=$db;charset=utf8",
$user,
$pass,
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
)
);
Se você especificar
UTF-8
você está trabalhando com o agrupamento padrão de utf8_general_ci
, a menos que sua tabela ou campo db use algo diferente. Se você quiser que todo o servidor responda com esse agrupamento padrão, use as diretivas de configuração:
collation_server=utf8_unicode_ci
character_set_server=utf8
Portanto, você não precisa especificá-lo na conexão sempre.
As ordenações afetam a ordenação dos caracteres e são definidas na tabela e campos em seu banco de dados. Essas configurações são respeitadas, ao consultar a tabela. Certifique-se de que eles estejam definidos. Use nomes UTF-8 com o agrupamento definido em seu banco de dados.
Seu comentário:
Vamos citar o Manual MySQL para provar isso:
Minha resposta:Funciona implicitamente, a menos que suas tabelas alterem isso explicitamente.
Pergunta do comentário:
Exemplo:o agrupamento de colunas substitui o agrupamento de tabelas
CREATE TABLE t1
(
col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci
) CHARACTER SET latin1 COLLATE latin1_bin;
Se CHARACTER SET X e COLLATE Y forem especificados em uma coluna, o conjunto de caracteres X e o agrupamento Y serão usados. A coluna tem um conjunto de caracteres
utf8
e agrupamento utf8_unicode_ci
conforme especificado na coluna da tabela, enquanto a tabela está em latin1 + latin1_bin. Exemplo:em geral, o agrupamento de tabelas é usado
Se a ordenação não for especificada explicitamente em uma coluna/campo, a ordenação da tabela será usada:
CREATE TABLE t1
(
col1 CHAR(10)
) CHARACTER SET latin1 COLLATE latin1_bin;
col1 tem agrupamento latino1_bin.
Se você quiser
utf8_unicode_ci
agrupamento, defina-o para suas tabelas em geral ou para as colunas/campos.