Я создаю новое веб-приложение с помощью Rails и задаюсь вопросом, какая разница между string
и text
? И когда каждый должен использоваться?
Разница зависит от того, как символ преобразуется в соответствующий тип столбца в языке запросов.
с 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
для более ожидаемого ввода, такого как описания, комментарии и т.д.
Если вы используете postgres, используйте текст, где бы вы ни находились, если у вас нет ограничения размера, так как для текста vs varchar нет значения производительности
Не существует разницы в производительности между этими тремя типами, кроме увеличенного пространства для хранения при использовании пустого типа и нескольких дополнительных циклов процессора для проверки длины при хранении в столбце с ограничением длины. Хотя характер (n) имеет преимущества производительности в некоторых других системах баз данных, в PostgreSQL такого преимущества нет; на самом деле символ (n) обычно является самым медленным из трех из-за его дополнительных затрат на хранение. В большинстве случаев вместо текста следует использовать текст или символ.
Строка преобразуется в "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...
, будут загружены текстовые столбцы. Это, вероятно, никогда не будет реальной проблемой в вашем или моем приложении, хотя (преждевременная оптимизация - это...). Но знать, что текст не всегда "свободен", хорошо знать.
Строка, если размер фиксирован и мал, а текст - переменный и большой. Это очень важно, потому что текст больше, чем строки. Он содержит намного больше килобайт.
Итак, для небольших полей всегда используйте строку (varchar). Поля вроде. first_name, логин, электронная почта, тема (статьи или сообщения) и пример текстов: содержание/тело сообщения или статьи. поля для абзацев и т.д.
Размер строки от 1 до 255 (по умолчанию = 255)
Размер текста от 1 до 4294967296 (по умолчанию = 65536) 2
Как объяснялось выше, не только тип данных db, это также повлияет на представление, которое будет сгенерировано, если вы являетесь подмостками. строка будет генерировать текст text_field будет генерировать text_area
Используйте строку для более короткого поля, например имена, адрес, телефон, компанию
Используйте текст для большего содержимого, комментариев, содержимого, абзацев.
Мое общее правило, если это что-то большее, чем одна строка, я обычно иду за текстом, если это короткие 2-6 слов, я иду за строкой.
Официальное правило - 255 для строки. Итак, если ваша строка содержит более 255 символов, перейдите к тексту.
Если атрибут соответствует f.text_field
в форме, используйте строку, если он соответствует f.text_area
используйте текст.
Если вы используете 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 }
}
:text
. См. Depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text