Respuestas:
La diferencia radica en cómo se convierte el símbolo en su tipo de columna respectivo en el lenguaje de consulta.
con MySQL: la cadena se asigna a 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)
Referencia:
¿Cuándo se debe usar cada uno?
Como regla general, use :string
para la entrada de texto breve (nombre de usuario, correo electrónico, contraseña, títulos, etc.) y use :text
para la entrada esperada más larga, como descripciones, contenido de comentarios, etc.
true
en un varchar (ergo, string
campo de tipo) en MySQL serializa el valor en 1
(lo cual es completamente justo). Sin embargo, bajo text
type, almacenar el valor "true" termina serializándolo como un carácter singular t
. Migré una columna sin darme cuenta de esto y todas las filas futuras donde el valor es verdadero es ahora t
. ¿Alguien tiene alguna idea de este comportamiento?
Si está utilizando postgres, use texto siempre que pueda, a menos que tenga una restricción de tamaño ya que no hay penalización de rendimiento para el texto frente a varchar
No hay diferencia de rendimiento entre estos tres tipos, aparte de un mayor espacio de almacenamiento cuando se usa el tipo de relleno en blanco, y algunos ciclos de CPU adicionales para verificar la longitud cuando se almacena en una columna de longitud limitada. Si bien el carácter (n) tiene ventajas de rendimiento en algunos otros sistemas de bases de datos, no existe tal ventaja en PostgreSQL; de hecho, el carácter (n) suele ser el más lento de los tres debido a sus costos de almacenamiento adicionales. En la mayoría de las situaciones, se debe usar texto o caracteres variables.
text
sobre (n)
tipos de datos son convincentes, pero el argumento para usar text
sobre varchar
no lo es. Él dice que son iguales pero prefiere text
porque varchar
se puede confundir con varchar(n)
y porque text
hay menos caracteres para escribir. Pero usando en text
lugar de varchar
, pierde el contexto de que los datos almacenados no deberían ser largos. Por ejemplo, almacenar un nombre de usuario con me text
parece engañoso.
La cadena se traduce a "Varchar" en su base de datos, mientras que el texto se traduce a "texto". Un varchar puede contener muchos menos elementos, un texto puede tener (casi) cualquier longitud.
Para un análisis en profundidad con buenas referencias, consulte http://www.pythian.com/news/7129/text-vs-varchar/
Editar: algunos motores de bases de datos pueden cargarse varchar
de una vez, pero almacenar texto (y blob) fuera de la tabla. A SELECT name, amount FROM products
podría ser mucho más lento cuando se usa text
por name
que cuando lo usa varchar
. Y desde Rails, de forma predeterminada, se cargan los registros con SELECT * FROM...
sus columnas de texto. Sin embargo, esto probablemente nunca será un problema real en su aplicación o la mía (la optimización prematura es ...). Pero saber que el texto no siempre es "gratis" es bueno saberlo.
Cadena si el tamaño es fijo y pequeño y texto si es variable y grande. Esto es importante porque el texto es mucho más grande que las cadenas. Contiene muchos más kilobytes.
Entonces, para campos pequeños, siempre use string (varchar). Campos como. nombre, nombre de usuario, correo electrónico, asunto (de un artículo o publicación) y ejemplos de textos: contenido / cuerpo de una publicación o artículo. campos para párrafos, etc.
Tamaño de cadena de 1 a 255 (predeterminado = 255)
Tamaño de texto 1 a 4294967296 (predeterminado = 65536) 2
Use una cadena para un campo más corto, como nombres, dirección, teléfono, compañía
Use Texto para contenido más grande, comentarios, contenido, párrafos.
Mi regla general, si es algo que es más de una línea, normalmente voy por texto, si es de 2 a 6 palabras cortas, voy por cadena.
La regla oficial es 255 para una cadena. Entonces, si su cadena tiene más de 255 caracteres, busque texto.
Si está utilizando Oracle ... STRING
se creará como VARCHAR(255)
columna y 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 }
}
La respuesta aceptada es increíble, explica adecuadamente la diferencia entre cadena y texto (principalmente el tamaño límite en la base de datos, pero hay algunas otras trampas), pero quería señalar un pequeño problema que me ayudó a resolverlo como esa respuesta no lo hizo completamente por mí.
El tamaño máximo : límite => 1 a 4294967296 no funcionó exactamente como lo puse, necesitaba ir -1 desde ese tamaño máximo. Estoy almacenando grandes blobs JSON y a veces pueden ser muy grandes.
Aquí está mi migración con el valor más grande establecido con el valor del que MySQL no se queja.
Tenga en cuenta el 5 al final del límite en lugar 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
Si el atributo coincide f.text_field
en la forma, use una cadena , si coincide, f.text_area
use el texto .
:text
. Ver depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text