Разницы нет, под капотом все varlena
( массив переменной длины ).
Проверьте эту статью от Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Несколько основных моментов:
Подводя итог всего этого:
- char (n) - занимает слишком много места при работе со значениями короче
n
(дополняет их n
) и может привести к незначительным ошибкам из-за добавления конечных пробелов, плюс изменение предела проблематично
- varchar (n) - изменить лимит в реальной среде проблематично (требуется исключительная блокировка при изменении таблицы)
- varchar - как текст
- текстовые - для меня победитель - над (n) типами данных, потому что ему не хватает их проблем, и над varchar - потому что у него разные имена
В статье проводится подробное тестирование, чтобы показать, что производительность операций вставки и выбора для всех 4 типов данных одинакова. Также подробно рассматриваются альтернативные способы ограничения длины при необходимости. Ограничения или области на основе функций обеспечивают преимущество мгновенного увеличения ограничения длины, и на основании того, что уменьшение ограничения длины строки встречается редко, Депес приходит к выводу, что один из них обычно является лучшим выбором для ограничения длины.
Как « типажи » в точках документации из,
varchar(n)
,char(n)
, иtext
сохраняются все точно так же. Единственное отличие состоит в том, что для проверки длины, если она задана, необходимы дополнительные циклы, а также дополнительное пространство и время, необходимые для заполненияchar(n)
.Однако, когда вам нужно сохранить только один символ, использование специального типа дает небольшое преимущество в производительности
"char"
(сохраняйте двойные кавычки - они являются частью имени типа). Вы получаете более быстрый доступ к полю, и нет затрат на хранение длины.Я только что сделал таблицу из 1000000 случайных слов,
"char"
выбранных из строчных букв. Запрос для получения распределения частоты (select count(*), field ... group by field
) занимает около 650 миллисекунд, против 760 для тех же данных с использованиемtext
поля.источник
"char"
неchar
?? Это действительно в наши дни PostgreSQL 11+? ... Да: «Тип"char"
(обратите внимание на кавычки) отличается от char (1) тем, что он использует только один байт памяти. Он внутренне используется в системных каталогах как упрощенный тип перечисления» . , руководство / тип данных-характер .ОБНОВЛЕНИЕ ЭТАЛОНОВ НА 2016 ГОД (pg9.5 +)
И с помощью тестов «чистый SQL» (без какого-либо внешнего скрипта)
использовать любой string_generator с UTF8
Основные показатели:
2.1. ВСТАВИТЬ
2.2. ВЫБЕРИТЕ сравнение и подсчет
Подготовить конкретный тест (примеры)
Выполните базовый тест:
И другие тесты,
... и пользуйся
EXPLAIN ANALYZE
.ОБНОВЛЕНИЕ СНОВА 2018 (pg10)
немного изменить, чтобы добавить результаты 2018 года и подкрепить рекомендации.
Результаты в 2016 и 2018 годах
Мои результаты, в среднем, во многих машинах и во многих тестах: все одинаковые
(статистически меньше стандартного отклонения).
Рекомендация
Используйте
text
тип данных,избегайте старых,
varchar(x)
потому что иногда это не стандарт, например, вCREATE FUNCTION
пунктахvarchar(x)
≠varchar(y)
.выразить ограничения (с той же
varchar
производительностью!) с помощьюCHECK
пункта в,CREATE TABLE
например
CHECK(char_length(x)<=10)
.С незначительной потерей производительности в INSERT / UPDATE вы также можете управлять диапазонами и структурой строк,
например
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
источник
"char"
, которого нетchar
, даже в настоящее время в PostgreSQL 11+. Как говорит символ guide / datatype : «Тип"char"
(обратите внимание на кавычки) отличается от char (1) тем, что он использует только один байт памяти. Он используется внутри системных каталогов как упрощенный тип перечисления» . ,Руководство по PostgreSQL
Я обычно использую текст
Ссылки: http://www.postgresql.org/docs/current/static/datatype-character.html
источник
На мой взгляд,
varchar(n)
имеет свои преимущества. Да, они все используют один и тот же базовый тип и все такое. Но следует отметить, что индексы в PostgreSQL имеют ограничение на размер 2712 байт на строку.TL; DR: если вы используете
text
тип без ограничения и у вас есть индексы для этих столбцов, вполне возможно, что вы достигнете этого предела для некоторых из ваших столбцов и получите ошибку при попытке вставить данные, но с использованиемvarchar(n)
, вы можете предотвратить это.Некоторые подробности: Проблема в том, что PostgreSQL не дает никаких исключений при создании индексов для
text
типа илиvarchar(n)
там, гдеn
значение больше 2712. Однако при попытке вставки записи со сжатым размером более 2712 возникнет ошибка. Это означает, что вы можете вставить 100 000 символов строки, которая легко состоит из повторяющихся символов, поскольку она будет сжата намного ниже 2712, но вы не сможете вставить строку из 4000 символов, поскольку сжатый размер превышает 2712 байт. Используяvarchar(n)
гдеn
не слишком много больше, чем 2712, вы защищены от этих ошибок.источник
text и varchar имеют разные неявные преобразования типов. Самое большое влияние, которое я заметил, это обработка конечных пробелов. Например ...
возвращается,
true, false, true
а не так,true, true, true
как вы могли ожидать.источник
Отчасти OT: если вы используете Rails, стандартное форматирование веб-страниц может отличаться. Поля для ввода данных
text
можно прокручивать, ноcharacter varying
(Railsstring
) - однострочные. Шоу просмотров столько, сколько нужно.источник
Хорошее объяснение от http://www.sqlines.com/postgresql/datatypes/text :
источник
character varying(n)
,varchar(n)
- (оба одинаковые). значение будет усечено до n символов без возникновения ошибки.character(n)
,char(n)
- (оба одинаковые). фиксированной длины и будет дополняться пробелами до конца длины.text
- Неограниченная длина.Пример:
Мы получаем результаты:
источник