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

384

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

Теги:

8 ответов

464
Лучший ответ

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

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

  • 11
    Я думаю, что лучшее правило - всегда использовать :text . См. Depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text
  • 66
    Для MySQL - не так много, вы можете иметь индексы для varchars, вы не можете для текста.
Показать ещё 4 комментария
146

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

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

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

  • 4
    Но в интересах быть независимым от базы данных, это лучший подход? Что делать, если вы хотите изменить базу данных? Я допускаю, что в реальном мире это случается не так часто, но все же ... если нет «разницы в производительности», почему бы не придерживаться ожидаемого использования строки для коротких вещей и текста для длинных вещей? И учитывая ваши собственные строки индексации комментариев, все еще кажется лучшим подходом.
  • 6
    Существует множество причин, по которым это может понадобиться в реальном мире, где лучше отказаться от идеи, что существует единственное верное решение для любой проблемы.
Показать ещё 5 комментариев
17

Строка преобразуется в "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..., будут загружены текстовые столбцы. Это, вероятно, никогда не будет реальной проблемой в вашем или моем приложении, хотя (преждевременная оптимизация - это...). Но знать, что текст не всегда "свободен", хорошо знать.

11

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

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

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

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

10

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

1

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

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

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

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

0

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню