- 1 1. Introdução
- 2 2. O que é um conjunto de caracteres MySQL? Entendendo o básico
- 3 3. Como verificar o conjunto de caracteres atual
- 4 4. Como Alterar o Conjunto de Caracteres do MySQL
- 4.1 Alterar o Conjunto de Caracteres Padrão em Todo o Servidor
- 4.2 Alterar o Conjunto de Caracteres no Nível do Banco de Dados
- 4.3 Alterar o Conjunto de Caracteres no Nível da Tabela
- 4.4 Alterar o Conjunto de Caracteres no Nível da Coluna
- 4.5 Verificação Pós-Alteração e a Importância de Backups
- 4.6 Resumo
- 5 5. Solução de Problemas Após Alterar o Conjunto de Caracteres
- 6 6. How Character Set Changes Affect Performance
- 7 7. Recommended Settings (Best Practices)
- 8 8. Perguntas Frequentes
- 8.1 Qual é a diferença entre utf8 e utf8mb4?
- 8.2 Alterar o conjunto de caracteres do MySQL causará perda de dados?
- 8.3 Como corrijo mojibake se acontecer?
- 8.4 Quais são os riscos ao converter de latin1 para utf8mb4?
- 8.5 Trocar para utf8mb4 afeta o desempenho?
- 8.6 Qual devo usar: utf8mb4_general_ci ou utf8mb4_unicode_ci?
- 8.7 As consultas ficarão mais lentas após mudar para utf8mb4?
- 8.8 Resumo
- 8.9 Notas Finais
1. Introdução
Por que você pode precisar mudar o conjunto de caracteres do MySQL
Um conjunto de caracteres de banco de dados é uma configuração importante que determina como os dados de texto são codificados e processados para armazenamento. No MySQL, o conjunto de caracteres padrão costuma ser latin1, o que pode causar problemas ao trabalhar com japonês ou outros caracteres especiais. Especialmente durante migração de dados ou padronização de sistemas, mudar para um conjunto de caracteres adequado torna‑se essencial.
Problemas comuns e suas causas
Problemas típicos relacionados a conjuntos de caracteres do MySQL incluem o seguinte.
- Mojibake (caracteres corrompidos)
utf8elatin1são misturados no mesmo ambiente- As configurações de conjunto de caracteres do cliente e do servidor não coincidem
- Problemas ao pesquisar
- Devido a diferenças de collation, os resultados de busca esperados não são retornados
- A ordem de classificação difere do que você espera
- Problemas durante migração de dados
- Emoji e símbolos especiais não podem ser salvos porque
utf8mb4não está sendo usado - A conversão de conjunto de caracteres não é tratada corretamente durante exportação/importação
Objetivos do artigo e estrutura
Este artigo fornece uma explicação abrangente sobre mudanças de conjunto de caracteres no MySQL, desde conceitos fundamentais até como mudar as configurações e solução de problemas.
Estrutura
- Conhecimento básico sobre conjuntos de caracteres do MySQL
- Como verificar o conjunto de caracteres atual
- Como mudar o conjunto de caracteres do MySQL
- Solução de problemas após a mudança
- Como as mudanças de conjunto de caracteres afetam o desempenho
- Configurações recomendadas (melhores práticas)
- FAQ (perguntas frequentes)
Ao ler este guia, você aprofundará seu entendimento sobre conjuntos de caracteres do MySQL e será capaz de escolher as configurações corretas e evitar problemas comuns.
2. O que é um conjunto de caracteres MySQL? Entendendo o básico
O que é um conjunto de caracteres?
Um conjunto de caracteres (Character Set) é um conjunto de regras usado para armazenar e processar caracteres como dados digitais. Por exemplo, ao armazenar o caractere japonês “あ”, UTF-8 o representa como a sequência de bytes E3 81 82, enquanto Shift_JIS usa 82 A0.
No MySQL, você pode especificar diferentes conjuntos de caracteres no nível do banco de dados ou da tabela. Ao escolher um conjunto de caracteres adequado, você pode prevenir mojibake e tornar a internacionalização mais fluida.
Conjuntos de caracteres comuns
| Character Set | Characteristics | Use Case |
|---|---|---|
utf8 | UTF-8 up to 3 bytes | Does not support some special characters (such as emoji) |
utf8mb4 | UTF-8 up to 4 bytes | Supports emoji and special characters (recommended) |
latin1 | ASCII-compatible | Used in older systems |
O que é collation?
Collation é o conjunto de regras usado para comparar e ordenar dados dentro de um conjunto de caracteres. Por exemplo, ele define se “A” e “a” são tratados como o mesmo caractere e como a ordenação é determinada.
Collations mais usadas
| Collation | Description |
|---|---|
utf8_general_ci | Case-insensitive, suitable for general use |
utf8_unicode_ci | Unicode-based collation (recommended) |
utf8mb4_bin | Binary comparison (use when exact matches are required) |
Diferenças entre utf8 e utf8mb4
O utf8 do MySQL na prática armazena no máximo 3 bytes por caractere, portanto não consegue lidar com certos caracteres especiais (como emoji ou alguns caracteres CJK estendidos). Em contraste, utf8mb4 suporta até 4 bytes por caractere, razão pela qual aplicações modernas são recomendadas a usar utf8mb4.
| Character Set | Max Bytes | Emoji Support | Recommendation |
|---|---|---|---|
utf8 | 3 bytes | ❌ Not supported | ❌ Not recommended |
utf8mb4 | 4 bytes | ✅ Supported | ✅ Recommended |
Por que você deve mudar de utf8 para utf8mb4
- Compatibilidade futura: Sistemas modernos estão cada vez mais padronizando em
utf8mb4. - Armazenamento de caracteres especiais e emoji: Com
utf8mb4, você pode lidar com segurança com dados de postagens em redes sociais e aplicativos de mensagens. - Internacionalização: Para sistemas multilíngues, reduz o risco de mojibake.
Resumo
- Conjunto de caracteres determina como os dados são armazenados e processados.
- Collation determina como os caracteres são comparados.
- O
utf8do MySQL está limitado a 3 bytes, portantoutf8mb4é recomendado. utf8mb4_unicode_cié uma collation comumente recomendada para uso geral.
3. Como verificar o conjunto de caracteres atual
Antes de mudar o conjunto de caracteres do MySQL, é importante verificar as configurações atuais.
Como os conjuntos de caracteres podem ser definidos em vários níveis (banco de dados, tabela, coluna), você deve entender exatamente onde as mudanças são necessárias.
Como verificar o conjunto de caracteres atual
Verificar o conjunto de caracteres do servidor MySQL
Primeiro, verifique as configurações de conjunto de caracteres e colação padrão para todo o servidor MySQL.
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Saída de exemplo:
+--------------------------+----------------------------+
| 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 |
+--------------------------+----------------------------+
Verificar o Conjunto de Caracteres por Banco de Dados
Para verificar o conjunto de caracteres para um banco de dados específico, use a consulta a seguir.
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';
Saída de exemplo
+----------------+----------------------+----------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------+----------------------+----------------------+
| my_database | utf8mb4 | utf8mb4_unicode_ci |
+----------------+----------------------+----------------------+
Verificar o Conjunto de Caracteres de uma Tabela
Esta é a forma de verificar o conjunto de caracteres para uma tabela específica.
SHOW CREATE TABLE table_name;
Saída de exemplo
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
Pontos de Verificação
DEFAULT CHARSET=latin1→ Não éutf8mb4, então uma alteração é necessáriaCOLLATE=latin1_swedish_ci→ Mudar parautf8mb4_unicode_cié geralmente mais apropriado
Verificar o Conjunto de Caracteres de uma Coluna
Para inspecionar o conjunto de caracteres no nível da coluna, execute o SQL a seguir.
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'database_name'
AND TABLE_NAME = 'table_name';
Saída de exemplo
+-------------+--------------------+----------------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME |
+-------------+--------------------+----------------------+
| name | latin1 | latin1_swedish_ci |
| email | utf8mb4 | utf8mb4_unicode_ci |
+-------------+--------------------+----------------------+
Neste exemplo, a coluna name usa latin1, então é recomendado alterá-la para utf8mb4.
Resumo
- Os conjuntos de caracteres do MySQL são configurados em múltiplos níveis (servidor, banco de dados, tabela, coluna).
- Verificando o conjunto de caracteres em cada nível, você pode aplicar as alterações corretas.
- Use comandos como
SHOW VARIABLESeSHOW CREATE TABLEpara entender completamente a configuração atual.

4. Como Alterar o Conjunto de Caracteres do MySQL
Alterando o conjunto de caracteres do MySQL de forma apropriada, você pode prevenir mojibake e suportar dados multilíngues de forma mais suave.
Nesta seção, explicamos como atualizar as configurações em cada nível: em todo o servidor, banco de dados, tabela e coluna.
Alterar o Conjunto de Caracteres Padrão em Todo o Servidor
Para alterar o conjunto de caracteres padrão em todo o servidor, você precisa editar o arquivo de configuração do MySQL (my.cnf ou my.ini).
Passos
- Abrir o arquivo de configuração
- No Linux:
bash sudo nano /etc/mysql/my.cnf No Windows: wp:list /wp:list
- Abra
C:\ProgramData\MySQL\MySQL Server X.X\my.ini
- Abra
- Adicionar ou alterar as configurações de conjunto de caracteres Adicione ou atualize as seguintes linhas na seção
mysqld.[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
- Reiniciar o MySQL
sudo systemctl restart mysql
No Windows:
net stop MySQL && net start MySQL
- Verificar a alteração
SHOW VARIABLES LIKE 'character_set_server';
Alterar o Conjunto de Caracteres no Nível do Banco de Dados
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Verificar a alteração
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'mydatabase';
Alterar o Conjunto de Caracteres no Nível da Tabela
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Verificar a alteração
SHOW CREATE TABLE users;
Alterar o Conjunto de Caracteres no Nível da Coluna
ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Verificar a alteração
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mydatabase'
AND TABLE_NAME = 'users';
Verificação Pós-Alteração e a Importância de Backups
Para preservar a integridade dos dados após mudar o conjunto de caracteres, siga estas etapas.
Faça backup dos seus dados
mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql
Verifique novamente as configurações
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE TABLE users;
Insira e exiba dados de teste
INSERT INTO users (name, email) VALUES ('Test User', 'test@example.com');
SELECT * FROM users;
Resumo
- Alteração do conjunto de caracteres em todo o servidor: Edite
my.cnfe definacharacter-set-server=utf8mb4 - Alteração do conjunto de caracteres do banco de dados:
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 - Alteração do conjunto de caracteres da tabela:
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 - Alteração do conjunto de caracteres da coluna:
ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 - Após as alterações, sempre verifique as configurações e teste seus dados
5. Solução de Problemas Após Alterar o Conjunto de Caracteres
Depois de mudar o conjunto de caracteres do MySQL, você pode encontrar casos em que o sistema não se comporta corretamente ou os dados armazenados ficam corrompidos. Nesta seção, explicamos problemas comuns e como corrigi‑los em detalhes.
Causas do Mojibake e Como Corrigi‑lo
Se mojibake ocorrer após mudar o conjunto de caracteres, as seguintes causas são comuns.
| Cause | How to Check | Solution |
|---|---|---|
| The client character set setting differs | SHOW VARIABLES LIKE 'character_set_client'; | Run SET NAMES utf8mb4; |
| Existing data was stored using a different encoding | SELECT HEX(column_name) FROM table_name; | Use CONVERT() or re-export the data |
| The connection encoding is not correct | Connect with mysql --default-character-set=utf8mb4 | Adjust the client-side character set configuration |
| Application settings (PHP/Python, etc.) are incorrect | mysqli_set_charset($conn, 'utf8mb4'); | Standardize the application’s character set settings |
Correção #1: Defina o conjunto de caracteres do cliente corretamente
SET NAMES utf8mb4;
Correção #2: Converta os dados existentes corretamente
UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);
Observações ao Converter de latin1 para utf8mb4
Procedimento seguro
- Faça backup dos dados atuais
mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
- Altere o conjunto de caracteres do banco de dados
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Altere o conjunto de caracteres da tabela
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Reimporte os dados
mysql -u root -p --default-character-set=utf8mb4 mydatabase < backup.sql
Dados Não São Pesquisáveis Após a Alteração
Caso #1: Busca com LIKE não funciona
SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci LIKE '%Tanaka%';
Caso #2: Ordem de classificação alterada
SELECT * FROM users ORDER BY BINARY name;
Medidas no Lado da Aplicação
Para PHP
mysqli_set_charset($conn, 'utf8mb4');
Para Python (MySQL Connector)
import mysql.connector
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="mydatabase",
charset="utf8mb4"
)
For Node.js (MySQL2)
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydatabase',
charset: 'utf8mb4'
});
Summary
- Post-change issues generally fall into three categories: client settings, data conversion, and application settings.
- To prevent mojibake, standardize the client character set using
SET NAMES utf8mb4. - Watch for LIKE search and sort order changes, and specify
COLLATEwhen needed. - Set
utf8mb4in your application as well to avoid encoding mismatches.
6. How Character Set Changes Affect Performance
When changing the MySQL character set to utf8mb4, there are several performance considerations, such as increased storage usage and index limitations.
In this section, we explain the impact and the best countermeasures.
Increased Storage Usage
Compared to MySQL’s utf8, utf8mb4 can use up to 4 bytes per character,
so the overall table size may increase.
Max bytes per character by character set
| Character Set | Max Bytes per Character |
|---|---|
latin1 | 1 byte |
utf8 | 3 bytes |
utf8mb4 | 4 bytes |
For example, with utf8, VARCHAR(255) is up to 765 bytes (255×3),
but with utf8mb4, it becomes up to 1020 bytes (255×4).
Countermeasure
ALTER TABLE posts MODIFY COLUMN title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Increased Index Size
MySQL enforces a maximum index key length.
After switching to utf8mb4, index entries become larger, and you may hit the limit—making indexes unusable.
Check index impact
SHOW INDEX FROM users;
Example error
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Countermeasure
ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Impact on Query Performance
Changing the character set to utf8mb4 may affect query execution speed.
Operations that may be affected
LIKEsearches over large datasetsORDER BYprocessing- JOIN query performance
Countermeasure
CREATE INDEX idx_name ON users(name(100));
Memory Usage and Buffer Tuning
With utf8mb4, memory usage may increase.
Recommended settings
[mysqld]
innodb_buffer_pool_size = 1G
query_cache_size = 128M
Summary
- Switching to
utf8mb4increases storage usage. - Index sizes increase and may exceed limits.
- Query performance can be affected.
- Because memory usage may increase, buffer sizes may need tuning.
7. Recommended Settings (Best Practices)
By setting MySQL character sets appropriately, you can maintain data integrity while optimizing performance.
In this section, we present recommended MySQL character set configurations and explain key points for an optimal setup.
Recommended MySQL Character Set Configuration
| Item | Recommended Setting | Reason |
|---|---|---|
| Character Set | utf8mb4 | Supports all Unicode characters including emoji and special characters |
| Collation | utf8mb4_unicode_ci | Case-insensitive and suitable for multilingual systems |
| Storage Engine | InnoDB | Good balance of performance and consistency |
| Indexed string length | VARCHAR(191) | Avoids exceeding MySQL index limits |
Recommended my.cnf Settings
1. MySQL Server Character Set Settings
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
query_cache_size = 128M
2. Client-Side Character Set Settings
[client]
default-character-set = utf8mb4
Recommended Database Settings
CREATE DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
To change an existing database character set:
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Recommended Table Settings
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Alterar Conjunto de Caracteres para Tabelas Existentes
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Diferenças entre utf8mb4_general_ci e utf8mb4_unicode_ci
| Collation | Characteristics | Use Case |
|---|---|---|
utf8mb4_general_ci | Faster comparisons, but less accurate | Performance-focused systems |
utf8mb4_unicode_ci | Unicode-standard, more accurate comparisons | General-purpose use (recommended) |
✅ Se você precisa de suporte multilíngue ou ordenação precisa, escolha utf8mb4_unicode_ci.
Otimização de Índice
CREATE FULLTEXT INDEX idx_fulltext ON articles(content);
Resumo
- A combinação de
utf8mb4+utf8mb4_unicode_cié recomendada. - Padronize as configurações do servidor (
my.cnf) e os conjuntos de caracteres de conexão. - Especifique explicitamente
utf8mb4nos níveis de banco de dados, tabela e coluna. - Use
VARCHAR(191)para evitar limitações de comprimento de chave de índice. - Use
utf8mb4_unicode_cipara comparações precisas.
8. Perguntas Frequentes
Aqui estão perguntas comuns do mundo real sobre a mudança de conjuntos de caracteres do MySQL.
Também abordamos como lidar com erros e como escolher as melhores configurações.
Qual é a diferença entre utf8 e utf8mb4?
SHOW VARIABLES LIKE 'character_set_server';
Alterar o conjunto de caracteres do MySQL causará perda de dados?
mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql
Como corrijo mojibake se acontecer?
UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);
Quais são os riscos ao converter de latin1 para utf8mb4?
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Trocar para utf8mb4 afeta o desempenho?
ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Qual devo usar: utf8mb4_general_ci ou utf8mb4_unicode_ci?
| Collation | Characteristics | Use Case |
|---|---|---|
utf8mb4_general_ci | Faster comparisons, but less accurate | Performance-focused systems |
utf8mb4_unicode_ci | Unicode-standard, accurate comparisons | General-purpose use (recommended) |
As consultas ficarão mais lentas após mudar para utf8mb4?
CREATE FULLTEXT INDEX idx_fulltext ON articles(content);
Resumo
✅ utf8mb4 é recomendado. utf8 não é recomendado devido às suas limitações.
✅ Antes de fazer alterações, sempre verifique as configurações com SHOW VARIABLES.
✅ Use fluxos de trabalho de exportação/importação para prevenir mojibake.
✅ Considere as limitações de índice e use VARCHAR(191) onde for apropriado.
✅ Para desempenho, adicione índices apropriados.
Notas Finais
Alterar o conjunto de caracteres do MySQL não é apenas um ajuste simples de configuração—é uma tarefa crítica que pode afetar a integridade dos dados e o desempenho.
Seguindo as configurações e procedimentos corretos, você pode migrar para utf8mb4 de forma segura e eficaz.
🔹 Siga os passos neste artigo e configure seu conjunto de caracteres corretamente! 🔹


