Подтвердить что ты не робот

Зачем задавать длину для символов разных типов

Ссылаясь на документацию Postgres на Типы символов, я неясен в отношении указания длины для изменяющихся символов (varchar).

Предположение:

  • длина строки не имеет значения для приложения.
  • вам все равно, что кто-то устанавливает максимальный размер в базе данных
  • у вас есть неограниченное место на жестком диске

Он упоминает:

Требование к хранению короткой строки (до 126 байтов) - 1 байт плюс фактическая строка, которая включает пробел в корпусе характера. Более длинные строки имеют 4 байта служебных данных вместо 1. Длинные строки автоматически сжимаются системой, поэтому физическое требование на диске может быть меньше. Очень длинные значения также хранятся в фоновых таблицах, чтобы они не мешали быстрому доступ к более коротким значениям столбцов. В любом случае, самое длинное символьная строка, которая может быть сохранена, составляет около 1 ГБ. (Максимальное значение который будет разрешен для n в объявлении типа данных, меньше, чем что. Было бы нецелесообразно изменять это, потому что с многобайтом кодировки символов количество символов и байтов может быть вполне отличается.

Это говорит о размере строки, а не о размере поля (т.е. кажется, что он всегда будет сжимать большую строку в большом поле varchar, но не маленькую строку в большом поле varchar?)

Я задаю этот вопрос, так как было бы намного проще (и ленив) указать гораздо больший размер, поэтому вам не придется беспокоиться о том, что строка слишком велика. Например, если я укажу varchar (50) для имени места, я получу местоположения с большим количеством символов (например, Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch), но если я укажу varchar (100) или varchar (500), то я не буду разбираться в этой проблеме.

Итак, вы получили бы удар производительности между varchar (500) и (произвольно) varchar (5000000) или text(), если ваша самая большая строка насчитывала 400 символов?

Также не представляет интереса, если у кого-то есть ответ на этот вопрос И знает ответ на это для других баз данных, добавьте это тоже.

У меня есть googled, но не нашел достаточно технического объяснения.

4b9b3361

Ответ 1

Я понимаю, что наличие ограничений полезно для целостности данных, поэтому я использую размеры столбцов для проверки элементов данных на нижнем уровне и для лучшего описания модели данных.

Некоторые ссылки по этому вопросу:

Ответ 2

Я понимаю, что это наследие старых баз данных с хранилищем, которое было не столь гибким, как у Postgres. Некоторые из них будут использовать структуры фиксированной длины, чтобы упростить поиск определенных записей, и поскольку SQL является стандартизированным языком, это наследие все еще наблюдается, даже если оно не дает каких-либо практических преимуществ.

Таким образом, ваш подход "сделать это большой" должен быть вполне разумным с Postgres, но он может плохо переноситься на другие менее гибкие системы РСУБД.

Ответ 3

Документация объясняет это:

Если переменная символов используется без спецификатора длины, тип принимает строки любого размера. Последнее является расширением PostgreSQL.

Стандарт SQL требует спецификации длины для всех ее типов. Это, вероятно, главным образом по причинам, связанным с наследием. Среди пользователей PostgreSQL предпочтение, как правило, состоит в том, чтобы опустить спецификацию длины, но если вы хотите написать переносимый код, вы должны включить его (и во многих случаях выбрать произвольный размер).

Ответ 4

Еще две мысли:

  • В документе Postgres говорится, что "очень длинные значения также хранятся в фоновых таблицах". Таким образом, определение всех строк как неограниченных, вероятно, приводит их в фоновые таблицы - наверняка поражает производительность.

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

  • Создание b-дерева для хранения индекса также будет отменено, поскольку он не сможет угадать разумную стратегию упаковки. Например, если пол был TEXT, как бы вы знали все это только M или F?