Я создаю новое веб-приложение с помощью 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)
Ссылка:
При каждом использовании?
В качестве общего правила используйте :string
для короткого ввода текста (имя пользователя, адрес электронной почты, пароль, титры и т.д.) и используйте :text
для более ожидаемого ввода, такого как описания, комментарии и т.д.
Ответ 2
Если вы используете postgres, используйте текст, где бы вы ни находились, если у вас нет ограничения размера, так как для текста vs varchar нет значения производительности
Не существует разницы в производительности между этими тремя типами, кроме увеличенного пространства для хранения при использовании пустого типа и нескольких дополнительных циклов процессора для проверки длины при хранении в столбце с ограничением длины. Хотя характер (n) имеет преимущества производительности в некоторых других системах баз данных, в PostgreSQL такого преимущества нет; на самом деле символ (n) обычно является самым медленным из трех из-за его дополнительных затрат на хранение. В большинстве случаев вместо текста следует использовать текст или символ.
Ответ 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 }
}
Ответ 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