Diferencia entre cadena y texto en rails?


Estoy haciendo una nueva aplicación web usando Rails, y me preguntaba, ¿cuál es la diferencia entre string y text? ¿Y cuándo deben usarse cada uno?

Author: Amanda S, 2010-07-28

7 answers

La diferencia radica en cómo el símbolo se convierte en su respectivo tipo de columna 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:

Http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

¿Cuándo deben usarse cada uno?

Como general regla general, use :string para introducir texto corto (nombre de usuario, correo electrónico, contraseña, títulos, etc.) y use :text para entradas esperadas más largas, como descripciones, contenido de comentarios, etc.

 476
Author: TJ Koblentz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 05:41:35

Si está utilizando postgres, use texto siempre que pueda, a menos que tenga una restricción de tamaño, ya que no hay ninguna penalización de rendimiento para texto vs varchar

No hay diferencia de rendimiento entre estos tres tipos, aparte de un mayor espacio de almacenamiento cuando se utiliza el tipo acolchado en blanco, y algunos ciclos adicionales de CPU para comprobar la longitud cuando se almacena en una columna de longitud limitada. Mientras que character (n) tiene ventajas de rendimiento en algunos otros sistemas de bases de datos, no existe tal ventaja en PostgreSQL; de hecho, character(n) es usualmente 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

Manual de PostsgreSQL

 144
Author: Omar Qureshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-28 15:53:17

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 ser de (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 cargar varchar de una sola vez, pero almacenan texto (y blob) fuera de la tabla. Un SELECT name, amount FROM products podría ser mucho más lento cuando se usa text para name que cuando se usa varchar. Y desde Rails, por defecto carga registros con SELECT * FROM... se cargarán tus columnas de texto. Esto probablemente nunca será un problema real en su o mi aplicación, aunque (optimización prematura es ...). Pero saber que el texto no siempre es "libre" es bueno saberlo.

 17
Author: berkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-13 07:55:17

Como se explicó anteriormente, no solo el tipo de datos de la base de datos, sino que también afectará a la vista que se generará si es un andamiaje. string generará un text_field text generará un text_area

 10
Author: ajet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-16 11:17:13

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.

Así que para campos pequeños siempre use string(varchar). Campos como. first_name, login, email, subject (de un artículo o post) y ejemplo de textos: contenido / cuerpo de un post o artículo. campos para los párrafos etc

Tamaño de cadena 1 a 255 (por defecto = 255)

Tamaño del texto 1 a 4294967296 (predeterminado = 65536)2

 10
Author: Gurudath BN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-04 05:22:31

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 un corto 2-6 palabras, voy por cadena.

La regla oficial es 255 para una cadena. Por lo tanto, si su cadena tiene más de 255 caracteres, vaya a texto.

 1
Author: user2012677,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 03:18:44

Si está utilizando oracle... STRING será creado como VARCHAR(255) columna y TEXT como 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 }
}

Https://github.com/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb

 0
Author: Luis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-19 07:46:21