Разница между строкой и текстом в рельсах?

Я создаю новое веб-приложение с помощью Rails и задаюсь вопросом, какая разница между string и text? И когда каждый должен использоваться?

Ответ 1

Разница зависит от того, как символ преобразуется в соответствующий тип столбца в языке запросов.

с MySQL: строка сопоставляется с 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)

Ссылка:

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

При каждом использовании?

В качестве общего правила используйте :string для короткого ввода текста (имя пользователя, адрес электронной почты, пароль, титры и т.д.) и используйте :text для более ожидаемого ввода, такого как описания, комментарии и т.д.

Ответ 2

Если вы используете postgres, используйте текст, где бы вы ни находились, если у вас нет ограничения размера, так как для текста vs varchar нет значения производительности

Не существует разницы в производительности между этими тремя типами, кроме увеличенного пространства для хранения при использовании пустого типа и нескольких дополнительных циклов процессора для проверки длины при хранении в столбце с ограничением длины. Хотя характер (n) имеет преимущества производительности в некоторых других системах баз данных, в PostgreSQL такого преимущества нет; на самом деле символ (n) обычно является самым медленным из трех из-за его дополнительных затрат на хранение. В большинстве случаев вместо текста следует использовать текст или символ.

Руководство по PostsgreSQL

Ответ 3

Строка преобразуется в "Varchar" в вашей базе данных, а текст переводится в "текст". Varchar может содержать гораздо меньше предметов, текст может быть (почти) любой длины.

Для углубленного анализа с хорошими ссылками проверьте http://www.pythian.com/news/7129/text-vs-varchar/

Изменить: некоторые базы данных могут загружать varchar за один раз, но хранить текст (и blob) за пределами таблицы. A SELECT name, amount FROM products может быть намного медленнее при использовании text для name, чем при использовании varchar. А поскольку Rails по умолчанию загружает записи с помощью SELECT * FROM..., будут загружены текстовые столбцы. Это, вероятно, никогда не будет реальной проблемой в вашем или моем приложении, хотя (преждевременная оптимизация - это...). Но знать, что текст не всегда "свободен", хорошо знать.

Ответ 4

Как объяснялось выше, не только тип данных db, это также повлияет на представление, которое будет сгенерировано, если вы являетесь подмостками. строка будет генерировать текст text_field будет генерировать text_area

Ответ 5

Строка, если размер фиксирован и мал, а текст - переменный и большой. Это очень важно, потому что текст больше, чем строки. Он содержит намного больше килобайт.

Итак, для небольших полей всегда используйте строку (varchar). Поля вроде. first_name, логин, электронная почта, тема (статьи или сообщения) и пример текстов: содержание/тело сообщения или статьи. поля для абзацев и т.д.

Размер строки от 1 до 255 (по умолчанию = 255)

Размер текста от 1 до 4294967296 (по умолчанию = 65536) 2

Ответ 6

Используйте строку для более короткого поля, например имена, адрес, телефон, компанию

Используйте текст для большего содержимого, комментариев, содержимого, абзацев.

Мое общее правило, если это что-то большее, чем одна строка, я обычно иду за текстом, если это короткие 2-6 слов, я иду за строкой.

Официальное правило - 255 для строки. Итак, если ваша строка содержит более 255 символов, перейдите к тексту.

Ответ 7

Если вы используете oracle... STRING будет создан как столбец VARCHAR(255) а TEXT - как 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

Ответ 8

Если атрибут соответствует f.text_field в форме, используйте строку, если он соответствует f.text_area используйте текст.

Ответ 9

Принятый ответ удивителен, он правильно объясняет разницу между строкой и текстом (в основном это предельный размер в базе данных, но есть несколько других ошибок), но я хотел указать на небольшую проблему, которая заставила меня пройти через этот ответ не полностью сделал это для меня.

Максимальный размер : limit => 1 до 4294967296 не работает точно, как положено, мне нужно было перейти -1 от этого максимального размера. Я храню большие капли JSON, и иногда они могут быть сумасшедшими.

Здесь моя миграция с большим значением на месте со значением MySQL не жалуется.

Обратите внимание на 5 в конце лимита вместо 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