Дополнительно
PostgreSQL: Разница между текстом и varchar (переменная символов)
В чем разница между типом данных text
и типами данных character varing
(varchar
)?
Согласно документации
Если символьная переменная используется без спецификатора длины, тип принимает строки любого размера. Последний тип является расширением PostgreSQL.
и
Кроме того, PostgreSQL предоставляет тип text, который хранит строки любой длины. Хотя тип text не входит в стандарт SQL, в некоторых других системах управления базами данных SQL он тоже есть.
Так в чем же разница?
551
8
Разницы нет, под капотом все
varlena
(массив переменной длины).Посмотрите эту статью от Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/.
Пара основных моментов:
В статье проводится подробное тестирование, показывающее, что производительность вставок и селектов для всех 4 типов данных одинакова. В ней также подробно рассматриваются альтернативные способы ограничения длины, когда это необходимо. Ограничения на основе функций или доменов дают преимущество мгновенного увеличения ограничения длины, и на основании того, что уменьшение ограничения длины строки встречается редко, Депеш делает вывод, что один из них обычно является лучшим выбором для ограничения длины.
Как указано в документации "Типы символов",
varchar(n)
,char(n)
иtext
хранятся одинаково. Единственное различие заключается в дополнительных циклах, необходимых для проверки длины, если она задана, а также в дополнительном пространстве и времени, требуемых дляchar(n)
, если требуется заполнение.Однако, когда вам нужно хранить только один символ, есть небольшое преимущество в производительности при использовании специального типа
"char"
(сохраните двойные кавычки - они являются частью имени типа). Вы получаете более быстрый доступ к полю, и нет накладных расходов на хранение длины.Я только что создал таблицу из 1,000,000 случайных
"символов"-, выбранных из алфавита со строчными буквами. Запрос для получения частотного распределения (
select count(*), field ... group by field) занимает около 650 миллисекунд, против около 760 на тех же данных с использованием поля
text`.Обновление показателей на 2016 год (pg9.5+)
И с помощью "в чистом SQL" и показатели (без какого-либо внешнего скрипта)
использовать любые string_generator с utf8
основные критерии:
2.1. Вставить
2.2. Выбрать сравнение и подсчет
Подготовить конкретные испытания (примеры)
В руководстве по PostgreSQL
Я обычно использую текст
Ссылки: http://www.postgresql.org/docs/current/static/datatype-character.html
На мой взгляд, `типа varchar(Н) она'ы собственного достоинства. Да, все они используют один и тот же базовый тип и все такое. Но, следует отметить, что индексы в PostgreSQL имеет своим предельным размером 2712 байт в ряду.
ТЛ;ДР: Если вы используете
текст
тип без ограничения и индексы на эти колонки, то очень возможно, что вы достигли этого предела для некоторых столбцов и получаете сообщение об ошибке при попытке вставить данные, но с помощьютипа varchar(н)
, вы можете предотвратить его.Больше деталей: проблема здесь заключается в том, что PostgreSQL не'т дать каких-либо исключений при создании индексов для
текст
или типатипа varchar(Н)
гдеN
- это больше, чем 2712. Однако, это даст ошибку при записи со сжатым размером больше, чем 2712 пытался быть вставлен. Это означает, что вы можете вставить 100.000 символ строки, которая состоит из повторяющихся символов легко, потому что он будет сжиматься намного ниже 2712 но вы не можете быть в состоянии, чтобы вставить строку с 4000 символов, так как сжатый размер больше 2712 байт. Используятипа varchar(Н)
гдеN
- это не слишком много больше, чем 2712, вы'Снова в безопасности от этих ошибок.Text и varchar имеют различные неявные преобразования типов. Самое большое влияние, что я'вэ заметил обрабатывает конечные пробелы. Например ...
возвращает значение true, false или true
, а не
правда, правда, правда, как вы могли бы ожидать.Несколько ВЗ: если вы're через рельсы, стандартные форматирования веб-страниц могут быть разными. Для поля ввода формы данных
текст
прокруткой, но разные символы(рельсы
строка`) ящики в одну линию. Показать как долго, как это необходимо.разные символы(Н)
,типа varchar(Н)
- (Как же). значение будет усечено до n символов без ошибки. <БР><БР>символ(Н)
,голец(Н)
- (Как же). фиксированной длины и колодки с заготовками до конца длины. <БР><БР>текст
- неограниченная длина. <БР><БР>Пример:<БР>
Мы получим результаты: