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

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

7 ответов


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

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


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

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

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


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

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

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


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


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

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

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

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


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

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

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

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


если вы используете oracle... STRING будет и 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