Garanta a Eficiência: Escolhendo entre tipos String no SQL
Tags: sql, mysql, beginners, database
Published: 2023-08-29 12:27:27

Garanta a eficiência, nova série fazendo mais sucesso que The Walking Dead, venha aprender como salvar seus strings no seu banco sql.

### Conteúdo

- 1 [Prólogo](#1)
- 2 [CHAR](#2)
- 3 [VARCHAR](#3)
- 4 [CHARSET e COLLATE](#4)
- 5 [Conclusão](#5)

### 1. Prólogo <a name="1"></a>
Dando continuidade à nossa série, já abordamos os valores numéricos agora, chegou a hora de nos aprofundarmos nas strings. Neste artigo, exploraremos as diferenças entre os tipos `VARCHAR` e `CHAR`, além de fornecer uma compreensão detalhada sobre os conceitos de `CHARSET` e `COLLATE`, os quais você certamente já encontrou em seus bancos de dados, mas talvez ainda não tenha uma ideia clara de suas finalidades.

### 2. CHAR <a name="2"></a>

O tipo de dado CHAR no MySQL é usado para armazenar strings de comprimento fixo.

Se o valor de uma string CHAR tiver um comprimento menor do que o comprimento especificado, os espaços em branco serão adicionados automaticamente ao final da string para preencher o espaço restante. Esses espaços em branco serão incluídos.

O tipo de dado CHAR é usado principalmente quando você precisa armazenar strings de comprimento fixo ou quando há um requisito específico para o tamanho da string. As comparações e pesquisas em colunas CHAR são mais rápidas do que em colunas VARCHAR porque não há necessidade de levar em consideração o tamanho variável.

### 3. VARCHAR <a name="3"></a>

O tipo de dado VARCHAR armazena strings de comprimento variável, o que significa que o tamanho ocupado no armazenamento depende do comprimento real da string. Por exemplo, se você definir uma coluna VARCHAR(255) e inserir uma string de apenas 10 caracteres, ela ocupará apenas a quantidade de espaço necessária para armazenar esses 10 caracteres.

O tipo de dado VARCHAR pode ser mais eficiente em termos de armazenamento em comparação com o tipo de dado CHAR se a maioria das strings armazenadas tiver comprimentos variáveis. Isso ocorre porque o espaço alocado para armazenar a string é proporcional ao comprimento real da string e não ao comprimento máximo especificado.

O tipo de dado VARCHAR **requer espaço adicional de armazenamento para registrar o comprimento real da string**. Esse espaço extra varia de 1 a 2 bytes, dependendo do tamanho máximo especificado para a coluna VARCHAR.

## 4. CHARSET e COLLATE <a name="4"></a>

```sql
CREATE TABLE strings (
	fixed100 CHAR(100), -- 100 bytes "Aaron     ..."
	var100 VARCHAR(100) -- 5 bytes + 1 Byte "Aaron"
);

SHOW CREATE TABLE strings;

CREATE TABLE `strings` (
  `fixed100` char(100) DEFAULT NULL,
  `var100` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1p9o2e6xfvf30wzn8nnn.png)



#### CHARSET (utf8mb4)

O CHARSET **`utf8mb4`** é uma configuração no MySQL que define o conjunto de caracteres utilizado para armazenar dados em colunas de texto. Nesse caso, o **`utf8mb4`** refere-se a um conjunto de caracteres multibyte que suporta a codificação UTF-8.

- **`utf8`**: Refere-se ao conjunto de caracteres UTF-8, que é um padrão universalmente aceito para representação de caracteres em várias línguas e scripts. O UTF-8 é capaz de representar uma ampla gama de caracteres e é amplamente utilizado em sistemas modernos.
- **`mb4`**: É uma abreviação de "multibyte 4", indicando que o conjunto de caracteres suporta até 4 bytes por caractere. Isso permite a representação de caracteres que requerem mais de 2 bytes, como emojis e caracteres especiais de diferentes idiomas.

#### COLLATE (utf8mb4_0900_ai_ci)

A cláusula COLLATE é usada para definir a ordem de classificação de caracteres em operações de comparação e classificação de texto. No caso específico do COLLATE **`utf8mb4_0900_ai_ci`**, é uma sequência de configuração que define a ordem de classificação. Essas definições são as seguintes:

- **`utf8mb4`**: É um conjunto de caracteres que suporta a codificação UTF-8 de caracteres multibyte. O UTF-8 é um padrão universalmente aceito para representação de caracteres e suporta uma ampla gama de caracteres de diferentes idiomas.
- **`0900`**: É um indicador da versão do algorítimo usado. Neste caso, **`0900`** refere-se à versão do Unicode Collation Algorithm (ou UCA). As versões mais recentes do MySQL podem introduzir atualizações e melhorias nos conjuntos de caracteres existentes.
- **`ai`**: É uma abreviação de "Accent Insensitive" (insensível a acentos). Isso significa que as comparações de caracteres são realizadas sem levar em consideração os acentos. Por exemplo, as letras "á" e "a" seriam consideradas iguais.
- **`ci`**: É uma abreviação de "Case Insensitive" (insensível a maiúsculas e minúsculas). Isso significa que as comparações de caracteres são realizadas sem levar em consideração a diferença entre letras maiúsculas e minúsculas. Por exemplo, as letras "A" e "a" seriam consideradas iguais.

### 5. Conclusão <a name="5"></a>

Neste artigo, exploramos a diferença entre os tipos de string `VARCHAR` e `CHAR` no MySQL. Aprendemos que o `CHAR` é ideal para tamanhos fixos, enquanto o `VARCHAR` é mais adequado para tamanhos variáveis. Além disso, compreendemos o papel do `CHARSET` e `COLLATE`, permitindo personalizar a ordenação de texto.

Com esse conhecimento, podemos tomar decisões mais acertadas ao projetar nossas tabelas no MySQL, garantindo a eficiência e o desempenho ideais para nossas aplicações. A escolha inteligente dos tipos de string e configurações de charset/collate é crucial para um banco de dados otimizado e bem-sucedido.