No MySQL, o armazenamento de caracteres chineses requer atenção especial devido às diferenças na codificação. Caracteres latinos como 'A' ou 'b' ocupam tipicamente 1 byte, enquanto caracteres CJK (como os chineses) geralmente requerem 3 bytes no esquema de codificação UTF-8. Essa distinção impacta diretamente na definição de tipos de dados e no cálculo de comprimento das strings.
Para armazenar texto com caracteres chineses, é crucial considerar o charset da tabela ou coluna. A codificação UTF-8 é a mais recomendada por ser universsal e oferecer bom equilíbrio entre compatibilidade e uso de espaço.
Definição de Tipos de Dados
Ao criar colunas para texto, escolha entre CHAR (comprimento fixo) ou VARCHAR (comprimanto variável). O valor dentro dos parênteses especifica o número máximo de caracteres, não de bytes. Portanto, uma coluna VARCHAR(50) pode conter até 50 caracteres, independentemente de serem chineses ou latinos.
CREATE TABLE cadastro (
id INT PRIMARY KEY,
nome_completo VARCHAR(100),
documento CHAR(14)
);
No exemplo acima, nome_completo aceita até 100 caracteres, o que pode representar desde 100 bytes (se todos forem ASCII) até 300 bytes (se todos forem chineses em UTF-8).
Cálculo do Comprimento
Para verificar o tamanho de uma string, o MySQL oferece duas funções importantes:
LENGTH(): Retorna o comprimento em bytes.CHAR_LENGTH(): Retorna o comprimento em caratceres.
SELECT LENGTH('Brasil'); -- Resultado: 6 (bytes)
SELECT CHAR_LENGTH('Brasil'); -- Resultado: 6 (caracteres)
SELECT LENGTH('葡萄牙'); -- Resultado: 9 (bytes, pois cada caractere CJK ocupa 3 bytes)
SELECT CHAR_LENGTH('葡萄牙'); -- Resultado: 3 (caracteres)
Para validações ou operações baseadas no número de caracteres digitados pelo usuário, utilize sempre CHAR_LENGTH().
Planejamento do Armazenamento
Ao projetar tabelas que receberão textos longos em chinês, calcule a necessidade real de bytes. Por exemplo, para um campo que deve acomodar comentários de até 1000 caracteres chineses:
CREATE TABLE comentarios (
id INT AUTO_INCREMENT PRIMARY KEY,
conteudo VARCHAR(1000),
data_postagem DATETIME
);
Em cenários com textos muito extensos (como artigos completos), considere utilizar os tipos TEXT, MEDIUMTEXT ou LONGTEXT, que possuem limites de armazenamento maiores em bytes.
CREATE TABLE artigos (
id INT PRIMARY KEY,
titulo VARCHAR(200),
corpo MEDIUMTEXT,
autor VARCHAR(100)
);
Lembre-se de que os limites do VARCHAR são baseados em caracteres, mas o armazenamento físico depende da codificação. Para colunas com charset utf8mb4 (que suporta caracteres de 4 bytes, como emojis), um caractere pode ocupar até 4 bytes.
Sempre verifique as configurações de collation e charset do banco ou tabela para garantir que o armazenamento e as comparações de strings ocorram corretamente.