Respostas:
A diferença depende de como o símbolo é convertido em seu respectivo tipo de coluna na linguagem de consulta.
com o MySQL: a string é mapeada para VARCHAR (255) - http://guides.rubyonrails.org/migrations.html
:string | VARCHAR | :limit => 1 to 255 (default = 255)
:text | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)
Referência:
Quando cada um deve ser usado?
Como regra geral, use :string
para entradas curtas de texto (nome de usuário, email, senha, títulos etc.) e use :text
para entradas esperadas mais longas, como descrições, conteúdo de comentários etc.
true
em um varchar (ergo, string
type field) no MySQL serializa o valor para 1
(o que é completamente justo). No entanto, no text
tipo, armazenar o valor "true" acaba sendo serializado como um caractere singular t
. Migrei uma coluna sem perceber isso e todas as linhas futuras em que o valor é verdadeiro são agora t
. Alguém tem alguma idéia desse comportamento?
Se você estiver usando o postgres, use texto sempre que puder, a menos que você tenha uma restrição de tamanho, pois não há penalidade de desempenho entre texto e varchar
Não há diferença de desempenho entre esses três tipos, além do aumento do espaço de armazenamento ao usar o tipo preenchido em branco e alguns ciclos extras de CPU para verificar o comprimento ao armazenar em uma coluna com restrição de comprimento. Embora o caractere (n) tenha vantagens de desempenho em alguns outros sistemas de banco de dados, não existe essa vantagem no PostgreSQL; de fato, o caractere (n) geralmente é o mais lento dos três devido aos seus custos adicionais de armazenamento. Na maioria das situações, a variação de texto ou caractere deve ser usada
text
excessivos (n)
são convincentes, mas o argumento de uso de text
excesso de dados varchar
não é. Ele diz que eles são iguais, mas prefere text
porque varchar
pode ser confundido varchar(n)
e porque text
há menos caracteres para digitar. Mas, em text
vez de usar varchar
, você perde o contexto em que os dados armazenados não devem ser longos. Por exemplo, armazenar um nome de usuário com text
parece enganador para mim.
String traduz para "Varchar" no seu banco de dados, enquanto texto é traduzido para "texto". Um varchar pode conter muito menos itens, um texto pode ter (quase) qualquer comprimento.
Para uma análise aprofundada com boas referências, verifique http://www.pythian.com/news/7129/text-vs-varchar/
Editar: Alguns mecanismos de banco de dados podem carregar varchar
de uma só vez, mas armazenam texto (e blob) fora da tabela. A SELECT name, amount FROM products
poderia ser muito mais lento ao usar text
do name
que ao usar varchar
. E como o Rails, por padrão, carrega os registros com SELECT * FROM...
suas colunas de texto. Isso provavelmente nunca será um problema real no seu ou no meu aplicativo (a otimização prematura é ...). Mas saber que o texto nem sempre é "gratuito" é bom saber.
Seqüência de caracteres se o tamanho for fixo e pequeno e texto se for variável e grande. Isso é importante porque o texto é muito maior que as strings. Ele contém muito mais kilobytes.
Portanto, para campos pequenos, use sempre string (varchar). Campos como. first_name, login, email, assunto (de um artigo ou postagem) e exemplo de textos: conteúdo / corpo de uma postagem ou artigo. campos para parágrafos etc
Tamanho da sequência de 1 a 255 (padrão = 255)
Tamanho do texto 1 a 4294967296 (padrão = 65536) 2
Use string para campos mais curtos, como nomes, endereço, telefone, empresa
Use Texto para conteúdo maior, comentários, conteúdo, parágrafos.
Minha regra geral, se é algo que tem mais de uma linha, eu normalmente uso texto, se tiverem de duas a seis palavras curtas, uso string.
A regra oficial é 255 para uma sequência. Portanto, se sua string tiver mais de 255 caracteres, vá para o texto.
Se você estiver usando o oracle ... STRING
será criado como VARCHAR(255)
coluna e TEXT
, como a CLOB
.
NATIVE_DATABASE_TYPES = {
primary_key: "NUMBER(38) NOT NULL PRIMARY KEY",
string: { name: "VARCHAR2", limit: 255 },
text: { name: "CLOB" },
ntext: { name: "NCLOB" },
integer: { name: "NUMBER", limit: 38 },
float: { name: "BINARY_FLOAT" },
decimal: { name: "DECIMAL" },
datetime: { name: "TIMESTAMP" },
timestamp: { name: "TIMESTAMP" },
timestamptz: { name: "TIMESTAMP WITH TIME ZONE" },
timestampltz: { name: "TIMESTAMP WITH LOCAL TIME ZONE" },
time: { name: "TIMESTAMP" },
date: { name: "DATE" },
binary: { name: "BLOB" },
boolean: { name: "NUMBER", limit: 1 },
raw: { name: "RAW", limit: 2000 },
bigint: { name: "NUMBER", limit: 19 }
}
A resposta aceita é impressionante, explica corretamente a diferença entre string e texto (principalmente o tamanho limite no banco de dados, mas existem algumas outras dicas), mas eu queria destacar um pequeno problema que me levou a resolver essa questão não fez isso completamente por mim.
O tamanho máximo : limite => 1 a 4294967296 não funcionou exatamente como foi colocado, eu precisava ir -1 desse tamanho máximo. Estou armazenando blobs JSON grandes e eles podem ser enormes demais às vezes.
Aqui está minha migração com o valor maior no lugar com o valor que o MySQL não reclama.
Observe os 5 no final do limite em vez de 6
class ChangeUserSyncRecordDetailsToText < ActiveRecord::Migration[5.1]
def up
change_column :user_sync_records, :details, :text, :limit => 4294967295
end
def down
change_column :user_sync_records, :details, :string, :limit => 1000
end
end
Se o atributo estiver correspondendo f.text_field
no formulário, use string , se estiver correspondendo, f.text_area
use text .
:text
. Veja depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text