Есть ли недостатки использования типа данных "текст" для хранения строк?

Согласно документации Postgres, они поддерживают 3 типа данных для символьных данных:

character varying(n), varchar(n)  variable-length with limit
character(n), char(n)             fixed-length, blank padded
text                              variable unlimited length

В моем приложении я столкнулся с несколькими неприятными сценариями, в которых запросы вставки / обновления не выполнялись, так как требуемый текст для вставки превышал varchar(n) или же char(n) предел.

Для таких случаев изменение типа данных таких столбцов на text хватило.

Мои вопросы:
Если мы обобщим и изменим тип данных каждого столбца хранения символов на textЕсть ли какие-либо недостатки с точки зрения производительности / памяти?
Если столбец с типом данных text хранит 10 или менее символов каждый раз, я должен пойти на text или же varchar(10)?
Если я пойду на text в чем минус?

3 ответа

Как правило, нет недостатка в использовании text с точки зрения производительности / памяти. Напротив: text является оптимальным. Другие типы имеют более или менее соответствующие недостатки. @Quassnoi и @Guffa уже пролили свет на это.

В частности, никогда не используйте char или же char(n) (псевдоним для character / character(n)), если вы не знаете, что делаете. Этот тип с пробелами только для совместимости со старым кодом и стандартами. В настоящее время это имеет мало смысла, тратит память и может вызвать проблемы:

Чтобы обеспечить максимальную длину столбца, по-прежнему используйте text (или же varchar без спецификатора длины, что в принципе то же самое), а не varchar(n) (псевдоним для character varying / character varying(n)). CHECK ограничение гораздо удобнее менять позже (без перезаписи таблицы), тем более, когда представления, функции, ограничения FK и т. д. зависят от типа столбца.

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 100);

CHECK Ограничение также может сделать больше, чем просто принудительно установить максимальную длину символа - все, что вы можете поместить в логическое выражение. Прочитайте больше:

Наконец, есть также "char" (с двойными кавычками): 1-байтовый тип данных для одной буквы ASCII, используемый в качестве дешевого типа внутреннего перечисления.

Я редко использую что-либо, кроме text для символьных данных в Postgres.

Со страницы, на которую вы ссылались:

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

Кажется, нет никаких недостатков использования text Тип данных в Postgres.

Однако вам следует подумать, действительно ли вы хотите разрешить хранить огромные тексты в базе данных. Держать это как varchar но с более высоким пределом защитит вас от непреднамеренного хранения огромных объемов данных в базе данных.

Все типы данных, которые вы упоминаете, используют одно и то же внутреннее представление (умеренно известный struct varlena)

CHAR а также VARCHAR типы данных просто добавляют проверки длины к этому, и (в случае CHAR), имеют разную семантику отступов.

Ты можешь использовать TEXT безопасно везде, где ничего из вышеперечисленного не важно для вашей логики.

Другие вопросы по тегам