Conjunto de Caracteres e Collation de Conexão
Toda conexão tem o seu conjunto de caracteres e collation, que não podem ser nulos. Esistem atualmente dois conjuntos de caracteres de conexão, que chamamos connection/literals
e connection/results
quando é necessário distingui-los.
Considere o que é uma conexão
: é o que você faz quando conecta ao servidor. O cliente envia instruções SQL, como consultas, pela conexão com o sevidor. O servidor envia respostas, como resultados, pela conexão de volta para o cliente. Isto leva a diversas questões, tal como: (a) em qual conjunto de caracteres está uma consulta quando ela deixa o cliente? (b) em qual conjunto de caracteres o servidor deve traduzir uma consulta após recebê-la? (c) para qual conjunto de caracteres o servidor deve traduzir antes de enviar o resultado ou mensagem de erros de volta para o cliente? Você pode fazer um ajuste fino das configurações para isto, ou você pode depender dos padrões (neste caso, você pode ignorar esta seção).
Existem suas instruções que afetam o conjunto de caracteres da conexão:
SET NAMES character_set_name SET CHARACTER SET character_set_name
SET NAMES
indica o que está na instrução SQL que o cliente envia. Assim, SET NAMES cp1251
diz ao servidor que futuras mensagens vindas do cliente estarão no conjunto de caracteres
e o servidor está livre para traduzir para seu próprio conjunto de caracteres, se apropriado.
cp1251
SET CHARACTER SET
indica o que está na instrução SQL que o cliente envia, e também o que está no resultado que o servidor envia de volta para o cliente. Assim, SET CHARACTER SET
inclui SET NAMES
, e também especifica qual conjunto de caracteres o valor da coluna terá se, por exempo, você usar uma instrução SELECT
.
EXEMPLO: Suponha que column1
é definido como CHAR(5) CHARACTER SET latin2
. Se você não utilizar SET CHARACTER SET
, então para SELECT column1 FROM t
o servidor enviará de volta todos os valores para column1
usando o conjunto de caracteres latin2
. Se por outro lado você usar SET CHARACTER SET latin1
então o servidor, antes de enviar de volta, converterá os valores latin2
para latin1
. Tal conversão é lenta e poder ter perdas.
Quando você executa SET NAMES
ou SET CHARACTER SET
, você também está alterando a collation da conexão
. No entanto a collation da conexão existe apenas para consistência. Normalmente o seu valor não importa.
Com o cliente MariaDB
, não é necessário executar SET NAMES
todas as vezes que você inicá-lo. Você pode adicionar a opção --default-character-set-name
a sua linha de instrução do MariaDB
, ou em seu arquivo de opção. Por exemplo, a seguinte configuração do arquivo de opção irá alterar o conjunto de caracteres da conexão cada vez que você executar MariaDB
: