Banco de dúvidas

Charsets e collations no MySQL

Charsets

Os campos tipo texto do MySQL (e outros SGBDs), como char, varchar, text, etc., têm uma propriedade que definem o conjunto de caracteres válidos naquele campo. Esses são os chamados "character sets" ou, de forma abreviada, "charsets". Há charsets pra vários idiomas. O mais usado com o português é o "latin1", que inclui todos os nossos caracteres acentuados. Porém o "UTF-8" é o mais recomendado ultimamente.

Você pode ver a lista de charsets suportados pelo MySQL com a seguinte consulta:

show character set;

Collations

Existem também as "collations" (que podem ser traduzidas por "colações" ou "agrupamentos") para cada um desses charsets. Elas definem as regras para comparação entre caracteres do charset. Há collations para comparar caracteres de diferentes idiomas, para ignorar (ou não) letras minúsculas e maiúculas, ou acentuação.

Por exemplo, digamos que seja feita uma consulta pela palavra "teste" em uma determinada coluna de uma tabela. Se a collation dessa coluna for "latin1_general_ci", o MySQL pode retornar as palavras "TESTE", "Teste", etc., pois as letras maiúsculas não se diferem das minúsculas (daí o sufixo "ci", de "case-insensitive"). Já na collation "latin1_general_cs", apenas o valor "teste" serviria.

Para ver a lista de collations de um determinado charset, use:

show collation where charset='latin1';

Unicode e UTF-8

O conjunto de caracteres Unicode é o mais abrangente. Ele engloba milhares de caracteres conhecidos, de vários idiomas, além de símbolos, emoticons, etc. Já o UTF-8 é uma forma prática de se usar o Unicode sem usar tanto espaço de armazenamento.

A tendência atualmente é usar o charset UTF-8 nos bancos de dados (especificamente o utf8mb4 no MySQL), pois serve para qualquer idioma.

utf8mb4

O UTF-8 do MySQL, por padrão, não suporta todos os caracteres possíveis do Unicode, utilizando até 3 bytes por caractere. Eles posteriormente criaram o charset utf8mb4, que pode ter até 4 bytes por caractere e é mais completo.

Então a recomendação mais atual de charset e collation para campos texto é utf8mb4 e utf8mb4_general_ci, respectivamente.

Charsets do banco de dados, tabelas e colunas

Cada coluna de uma mesma tabela pode ter charsets e collations diferentes. Já as tabelas e bancos de dados não têm charsets ou collations próprios, mas pode-se definir seu valor padrão ao criá-los.

Por exemplo, se você, ao criar uma coluna da tabela, não especificar o charset/collation, o MySQL vai usar os da tabela. E a tabela vai adotar os do banco de dados se não indicados no "create table".

Dica: para ver a codificação de uma tabela, use o comando:

show create table nome_da_tabela;

Vai aparecer algo assim (exemplo):

CREATE TABLE `Usuarios` (
  `Usuario` varchar(30) NOT NULL DEFAULT '',
  `Senha` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`Usuario`)
) ENGINE=MyISAM DEFAULT CHARSET=utf-8;

Na última linha informa o conjunto de caracteres padrão da tabela. Isso quer dizer que as colunas de texto da tabela, por padrão, aceitam caracteres do conjunto "UTF-8". Mesmo assim, você pode definir cada coluna texto com charset diferente do padrão, se necessário.

Conversão

Veja como converter entre os vários charsets e collations no MySQL.

Este artigo foi útil para você?