AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 386
Accepted
Derek Downey
Derek Downey
Asked: 2011-01-08 06:52:24 +0800 CST2011-01-08 06:52:24 +0800 CST 2011-01-08 06:52:24 +0800 CST

Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • 772

Após a versão 5.0.3 (que permitiu que VARCHAR tivesse 65.535 bytes e parou de truncar espaços à direita), há alguma diferença importante entre esses dois tipos de dados?

Eu estava lendo a lista de diferenças e as únicas duas dignas de nota são:

Para índices em colunas BLOB e TEXT, você deve especificar um comprimento de prefixo de índice. Para CHAR e VARCHAR, um comprimento de prefixo é opcional. Consulte a Seção 7.5.1, “Índices de coluna”.

e

As colunas BLOB e TEXT não podem ter valores DEFAULT.

Então, por causa dessas duas limitações no tipo de dados TEXT, por que você o usaria sobre varchar(65535) ? Existem ramificações de desempenho de um sobre o outro?

mysql database-design
  • 2 2 respostas
  • 39237 Views

2 respostas

  • Voted
  1. Best Answer
    Joe
    2011-01-09T04:49:26+08:002011-01-09T04:49:26+08:00

    dividido ligado a algumas informações que explicam o problema básico (há diferenças de desempenho), mas não é simples o suficiente dizer que um é sempre melhor que o outro. (caso contrário, não haveria razão para ter ambos.) Além disso, no MyISM, o tamanho máximo de 64k para VARCHAR não é por campo -- é por registro.

    Basicamente, existem 4 maneiras de armazenar strings em registros de banco de dados:

    1. comprimento fixo
    2. Strings de estilo C (marcadas com um caractere NULL ou similar no final da string)
    3. Strings de estilo Pascal (alguns bytes para indicar o comprimento, depois a string)
    4. Ponteiros (armazenar a string em outro lugar)

    MyISM usa algo semelhante ao #3 para VARCHAR e uma abordagem híbrida para TEXT onde armazena o início da string no registro e o restante da string em outro lugar. O InnoDB é semelhante para VARCHAR, mas armazena o campo TEXT completo fora do registro.

    Com 1 e 4, as coisas no registro são sempre do mesmo tamanho, então é mais fácil pular se você não precisar da string, mas precisar de coisas depois dela. Tanto o #2 quanto o #3 não são tão ruins para strings curtas... #2 tem que continuar procurando o marcador, enquanto o #3 pode pular adiante... caso.

    Se você realmente precisa ler a string, #4 é mais lento, pois você tem que ler o registro e depois ler a string que pode estar armazenada em outro lugar no disco, dependendo de como o banco de dados lida com isso. O nº 1 é sempre bem direto e, novamente, você se depara com problemas semelhantes, onde o nº 2 fica pior quanto maior a corda, enquanto o nº 3 é um pouco pior que o nº 2 para cordas muito pequenas, mas melhor à medida que fica mais longa.

    Depois, há requisitos de armazenamento ... # 1 é sempre um comprimento fixo, portanto, pode ter inchaço se a maioria das strings não tiver o comprimento máximo. #2 tem 1 byte extra; #3 normalmente tem 2 bytes extras se comprimento máximo = 255, 4 bytes extras se um comprimento máximo de 64k. #4 tem o comprimento do ponteiro, mais as regras para #3 normalmente.

    Para as implementações específicas no MySQL 5.1, os documentos do estado do MyISM :

    • Suporte para um tipo VARCHAR verdadeiro; uma coluna VARCHAR começa com um comprimento armazenado em um ou dois bytes.
    • Tabelas com colunas VARCHAR podem ter comprimento de linha fixo ou dinâmico.
    • A soma dos comprimentos das colunas VARCHAR e CHAR em uma tabela pode ser de até 64 KB.

    Enquanto para InnoDB :

    • A parte de comprimento variável do cabeçalho do registro contém um vetor de bits para indicar colunas NULL. Se o número de colunas no índice que pode ser NULL for N, o vetor de bits ocupará CEILING(N/8) bytes. (Por exemplo, se houver de 9 a 15 colunas que podem ser NULL, o vetor de bits usa dois bytes.) As colunas que são NULL não ocupam espaço além do bit nesse vetor. A parte de comprimento variável do cabeçalho também contém os comprimentos das colunas de comprimento variável. Cada comprimento leva um ou dois bytes, dependendo do comprimento máximo da coluna. Se todas as colunas no índice forem NOT NULL e tiverem um comprimento fixo, o cabeçalho do registro não terá parte de comprimento variável.
    • Para cada campo de comprimento variável não NULL, o cabeçalho do registro contém o comprimento da coluna em um ou dois bytes. Dois bytes só serão necessários se parte da coluna for armazenada externamente em páginas de estouro ou o comprimento máximo exceder 255 bytes e o comprimento real exceder 127 bytes. Para uma coluna armazenada externamente, o comprimento de dois bytes indica o comprimento da parte armazenada internamente mais o ponteiro de 20 bytes para a parte armazenada externamente. A parte interna tem 768 bytes, então o comprimento é 768+20. O ponteiro de 20 bytes armazena o comprimento real da coluna.

    ...

    como acontece com tantas outras coisas ao lidar com bancos de dados, se você não tiver certeza do que é melhor para suas necessidades, tente comparar com dados e uso semelhantes e veja como eles se comportam.

    • 16
  2. Rick James
    2012-04-06T11:51:09+08:002012-04-06T11:51:09+08:00

    Quando um SELECT precisa criar uma tabela temporária (como para classificar os resultados), ele criará uma tabela MEMORY ou uma tabela MyISAM. A MEMÓRIA é mais eficiente. Existem restrições em MEMORY -- uma delas é não permitir TEXT e BLOB. Portanto, um SELECT pode ser executado mais lentamente com TEXT do que VARCHAR.

    • 3

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve