Comprimento de Strings no MySQL para Caracteres Chineses

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.

Tags: MySQL utf-8 Codificação VARCHAR CHAR

Publicado em 7-18 02:05