mysql - variable - sqlserver varchar text




MySQL: Grande VARCHAR vs. TEXTO? (4)

Eu tenho uma tabela de mensagens no MySQL que registra mensagens entre usuários. Além dos ids e tipos de mensagem típicos (todos os tipos inteiros), eu preciso salvar o texto da mensagem como VARCHAR ou TEXT. Estou definindo um limite de front-end de 3000 caracteres, o que significa que as mensagens nunca seriam inseridas no banco de dados por mais tempo que isso.

Existe uma razão para ir com VARCHAR (3000) ou TEXTO? Há algo sobre apenas escrever VARCHAR (3000) que parece um pouco contra-intuitivo. Já passei por outras postagens semelhantes no Stack Overflow, mas seria bom obter visualizações específicas para esse tipo de armazenamento comum de mensagens.


Apenas para esclarecer a melhor prática:

  1. Mensagens de formato de texto quase sempre devem ser armazenadas como TEXT (elas acabam sendo arbitrariamente longas)

  2. Os atributos de cadeia devem ser armazenados como VARCHAR (o nome do usuário de destino, o assunto, etc ...).

Eu entendo que você tem um limite de front end, o que é ótimo até que não seja. * sorriso * O truque é pensar no DB como separado dos aplicativos que se conectam a ele. Só porque uma aplicação coloca um limite nos dados, não significa que os dados sejam intrinsecamente limitados.

O que é sobre as próprias mensagens que as obriga a nunca ter mais de 3000 caracteres? Se for apenas uma restrição de aplicativo arbitrário (por exemplo, para uma caixa de texto ou algo assim), use um campo TEXT na camada de dados.


As respostas anteriores não insistem bastante no problema principal: mesmo em consultas muito simples como

(SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id) 

uma tabela temporária pode ser necessária e, se um campo VARCHAR estiver envolvido, ela será convertida em um campo CHAR na tabela temporária. Portanto, se você tiver em sua tabela, digamos 500.000 linhas com um campo VARCHAR(65000) , essa coluna sozinha usará 6.5 * 5 * 10 ^ 9 bytes. Essas tabelas temporárias não podem ser manipuladas na memória e são gravadas no disco. Espera-se que o impacto seja catastrófico.

Fonte (com métricas): https://nicj.net/mysql-text-vs-varchar-performance/ (Refere-se à manipulação de TEXT vs VARCHAR no mecanismo de armazenamento MyISAM "padrão" (?). Pode ser diferente em outros, por exemplo, InnoDB.)


Você pode prever quanto tempo a entrada do usuário seria?

VARCHAR (X)

Caso: nome de usuário, email, país, assunto, senha

TEXTO

Caso: mensagens, e-mails, comentários, texto formatado, html, código, imagens, links

MEDIUMTEXT

Caso: grandes corpos json, livros de curta a média duração, cadeias csv

LONGTEXT

Caso: livros - texto, programas, anos de arquivos de registros, harry potter e o cálice de fogo, registro de pesquisa científica


Resposta curta: sem diferença prática, de desempenho ou de armazenamento.

Resposta longa:

Não há essencialmente nenhuma diferença (no MySQL) entre VARCHAR(3000) (ou qualquer outro limite grande) e TEXT . O primeiro truncará em 3000 caracteres ; o último truncará em 65535 bytes . (Eu faço uma distinção entre bytes e caracteres porque um caractere pode ter vários bytes.)

Para limites menores no VARCHAR , existem algumas vantagens sobre o TEXT .

  • "menor" significa 191, 255, 512, 767 ou 3072, etc, dependendo da versão, do contexto e do CHARACTER SET .
  • INDEXes são limitados em quão grande uma coluna pode ser indexada. (767 ou 3072 bytes ; isso depende da versão e das configurações)
  • Tabelas intermediárias criadas por SELECTs complexos são tratadas de duas maneiras diferentes - MEMORY (mais rápido) ou MyISAM (mais lento). Quando colunas "grandes" estão envolvidas, a técnica mais lenta é escolhida automaticamente. (Alterações significativas na versão 8.0; portanto, este item está sujeito a alterações.)
  • Relacionado ao item anterior, todos os tipos de dados TEXT (em oposição a VARCHAR ) saltam diretamente para o MyISAM. Isto é, o TINYTEXT é pior para tabelas temporárias geradas do que o VARCHAR equivalente. (Mas isso leva a discussão em uma terceira direção!)
  • VARBINARY é como VARCHAR ; BLOB é como TEXT .

Refutação a outras respostas

A pergunta original perguntou uma coisa (que tipo de dados usar); a resposta aceita respondeu a outra coisa (armazenamento fora do registro). Essa resposta está desatualizada.

Quando este tópico foi iniciado e respondido, havia apenas dois "formatos de linha" no InnoDB. Logo em seguida, mais dois formatos ( DYNAMIC e COMPRESSES ) foram introduzidos.

O local de armazenamento para TEXT e VARCHAR() é baseado no tamanho , não no nome do tipo de dados . Para uma discussão atualizada do armazenamento on / off-record de grandes colunas de texto / blob, veja this .





varchar