Ответы:
Разница заключается в том, как символ преобразуется в соответствующий тип столбца на языке запросов.
с 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
для более продолжительного ввода, такого как описания, комментарии и т. Д.
true
в varchar (ergo, string
поле типа) в MySQL сериализует значение в 1
(что совершенно справедливо). Однако при text
типе сохранение значения «true» приводит к его сериализации в виде единственного символа t
. Я перенес столбец, не осознавая этого, и все будущие строки, где значение true, сейчас t
. У кого-нибудь есть понимание этого поведения?
Если вы используете postgres, используйте текст везде, где только можете, если только у вас нет ограничений по размеру, так как для текста и varchar не снижается производительность
Между этими тремя типами нет разницы в производительности, за исключением увеличения места для хранения при использовании типа с пробелом и нескольких дополнительных циклов ЦП для проверки длины при сохранении в столбце с ограниченной длиной. Хотя символ (n) имеет преимущества в производительности в некоторых других системах баз данных, в PostgreSQL такого преимущества нет; на самом деле символ (n) обычно самый медленный из трех из-за дополнительных затрат на хранение. В большинстве случаев вместо текста следует использовать различные символы или символы.
text
над (n)
типами данных убедительны, но аргумент для использования text
над varchar
не. Он говорит, что они одинаковы, но предпочитает, text
потому что varchar
их можно спутать varchar(n)
и потому, что text
меньше символов для ввода. Но text
вместо этого varchar
вы теряете контекст, в котором хранящиеся данные не должны быть длинными. Например, сохранение имени пользователя с помощью text
мне кажется вводящим в заблуждение.
Строка переводится как «Varchar» в вашей базе данных, а текст переводится как «текст». Varchar может содержать гораздо меньше элементов, текст может быть (почти) любой длины.
Для углубленного анализа с хорошими ссылками проверьте http://www.pythian.com/news/7129/text-vs-varchar/
Редактировать: некоторые движки базы данных могут загружаться varchar
за один раз, но хранить текст (и большие двоичные объекты) вне таблицы. А SELECT name, amount FROM products
может быть намного медленнее при использовании text
для, name
чем когда вы используете varchar
. А так как Rails по умолчанию загружает записи с SELECT * FROM...
вашими текстовыми колонками, будут загружены. Это, вероятно, никогда не будет реальной проблемой в вашем или моем приложении, хотя (преждевременная оптимизация ...). Но знание того, что текст не всегда «бесплатный», полезно знать.
Строка, если размер фиксированный и маленький, и текст, если он переменный и большой. Это очень важно, потому что текст больше строк. Он содержит намного больше килобайт.
Поэтому для небольших полей всегда используйте строку (varchar). Поля как. имя, логин, адрес электронной почты, тема (статьи или сообщения) и пример текстов: содержание / текст сообщения или статьи. поля для абзацев и т. д.
Размер строки от 1 до 255 (по умолчанию = 255)
Размер текста от 1 до 4294967296 (по умолчанию = 65536) 2
Используйте строку для более короткого поля, как имена, адрес, телефон, компания
Используйте текст для большего содержания, комментариев, контента, абзацев.
Мое общее правило: если речь идет о чем-то, что больше чем одна строка, я обычно иду за текстом, если это короткие 2-6 слов, я иду за строкой.
Официальное правило - 255 для строки. Итак, если ваша строка содержит более 255 символов, перейдите к тексту.
Если вы используете оракул ... 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 }
}
Принятый ответ удивителен, он правильно объясняет разницу между строкой и текстом (в основном это предельный размер в базе данных, но есть несколько других ошибок), но я хотел указать на небольшую проблему, которая заставила меня пройти через этот ответ не полностью сделал это для меня.
Максимальный размер : 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
Если атрибут соответствует f.text_field
в форме, используйте строку , если он соответствует, f.text_area
используйте текст .
:text
. См. Depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text