Essa pergunta já tem muitas respostas, mas Mathias Bynens mencionou que 'utf8mb4' deve ser usado em vez de 'utf8' para ter um melhor suporte UTF-8 ('utf8' não suporta caracteres de 4 bytes, os campos são truncados na inserção ) Considero isso uma diferença importante. Então, aqui está mais uma resposta sobre como definir o conjunto de caracteres padrão e agrupamento. Um que lhe permitirá inserir uma pilha de cocô (💩).
Isso funciona no MySQL 5.5.35.
Observe que algumas das configurações podem ser opcionais. Como não tenho certeza absoluta de que não esqueci nada, tornarei esta resposta um wiki da comunidade.
Configurações antigas
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
Config
# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4
Novas configurações
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
character_set_system é sempre utf8 .
Isso não afetará as tabelas existentes, é apenas a configuração padrão (usada para novas tabelas). O seguinte código ALTER pode ser usado para converter uma tabela existente (sem a solução alternativa de restauração de despejo):
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Editar:
Em um servidor MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection permanecem em latin1. A emissão SET NAMES utf8
(utf8mb4 não disponível nessa versão) também os define como utf8.
Advertência : Se você tinha uma tabela utf8 com uma coluna de índice do tipo VARCHAR (255), ela não pode ser convertida em alguns casos, porque o comprimento máximo da chave foi excedido ( Specified key was too long; max key length is 767 bytes.
). Se possível, reduza o tamanho da coluna de 255 para 191 (porque 191 * 4 = 764 <767 <192 * 4 = 768). Depois disso, a tabela pode ser convertida.
utf8mb4
, ou seja, UTF-8 real com suporte completo a Unicode. Veja Como suportar Unicode completo nos bancos de dados MySQL .