Guia de Alteração de Conjunto de Caracteres MySQL: Converta para utf8mb4 (Corrija o Mojibake)

目次

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.

  1. Mojibake (caracteres corrompidos)
  • utf8 e latin1 são misturados no mesmo ambiente
  • As configurações de conjunto de caracteres do cliente e do servidor não coincidem
  1. 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
  1. Problemas durante migração de dados
  • Emoji e símbolos especiais não podem ser salvos porque utf8mb4 nã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

  1. Conhecimento básico sobre conjuntos de caracteres do MySQL
  2. Como verificar o conjunto de caracteres atual
  3. Como mudar o conjunto de caracteres do MySQL
  4. Solução de problemas após a mudança
  5. Como as mudanças de conjunto de caracteres afetam o desempenho
  6. Configurações recomendadas (melhores práticas)
  7. 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 SetCharacteristicsUse Case
utf8UTF-8 up to 3 bytesDoes not support some special characters (such as emoji)
utf8mb4UTF-8 up to 4 bytesSupports emoji and special characters (recommended)
latin1ASCII-compatibleUsed 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

CollationDescription
utf8_general_ciCase-insensitive, suitable for general use
utf8_unicode_ciUnicode-based collation (recommended)
utf8mb4_binBinary 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 SetMax BytesEmoji SupportRecommendation
utf83 bytes❌ Not supported❌ Not recommended
utf8mb44 bytes✅ Supported✅ Recommended

Por que você deve mudar de utf8 para utf8mb4

  1. Compatibilidade futura: Sistemas modernos estão cada vez mais padronizando em utf8mb4.
  2. 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.
  3. 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 utf8 do MySQL está limitado a 3 bytes, portanto utf8mb4 é 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ária
  • COLLATE=latin1_swedish_ci → Mudar para utf8mb4_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 VARIABLES e SHOW CREATE TABLE para 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

  1. 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
  1. 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
    
  1. Reiniciar o MySQL
    sudo systemctl restart mysql
    

No Windows:

net stop MySQL && net start MySQL
  1. 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.cnf e defina character-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.

CauseHow to CheckSolution
The client character set setting differsSHOW VARIABLES LIKE 'character_set_client';Run SET NAMES utf8mb4;
Existing data was stored using a different encodingSELECT HEX(column_name) FROM table_name;Use CONVERT() or re-export the data
The connection encoding is not correctConnect with mysql --default-character-set=utf8mb4Adjust the client-side character set configuration
Application settings (PHP/Python, etc.) are incorrectmysqli_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

  1. Faça backup dos dados atuais
    mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
    
  1. Altere o conjunto de caracteres do banco de dados
    ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. Altere o conjunto de caracteres da tabela
    ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. 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 COLLATE when needed.
  • Set utf8mb4 in 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 SetMax Bytes per Character
latin11 byte
utf83 bytes
utf8mb44 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

  • LIKE searches over large datasets
  • ORDER BY processing
  • 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 utf8mb4 increases 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

ItemRecommended SettingReason
Character Setutf8mb4Supports all Unicode characters including emoji and special characters
Collationutf8mb4_unicode_ciCase-insensitive and suitable for multilingual systems
Storage EngineInnoDBGood balance of performance and consistency
Indexed string lengthVARCHAR(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

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, more accurate comparisonsGeneral-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 utf8mb4 nos 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_ci para 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?

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, accurate comparisonsGeneral-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! 🔹