Разница между строкой и текстом в рельсах? - PullRequest
418 голосов
/ 28 июля 2010

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

Ответы [ 9 ]

505 голосов
/ 28 июля 2010

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

с 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 для более ожидаемого ввода, такого как описания, комментарии и т. Д.

149 голосов
/ 28 июля 2010

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

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

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

17 голосов
/ 28 июля 2010

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

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

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

11 голосов
/ 04 февраля 2015

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

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

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

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

11 голосов
/ 16 июня 2014

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

2 голосов
/ 15 января 2017

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

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

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

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

0 голосов
/ 09 июля 2019

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

Максимальный размер : 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
0 голосов
/ 25 января 2019

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

0 голосов
/ 19 сентября 2018

Если вы используете оракул ... 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...