Недостаток выбора большого МАКСИМАЛЬНОГО значения для varchar или varbinary

StackOverflow https://stackoverflow.com/questions/475049

  •  19-08-2019
  •  | 
  •  

Вопрос

В чем недостаток выбора большого значения для max при создании столбца varchar или varbinary?

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

Спасибо

Это было полезно?

Решение

Это зависит от того, разумно ли вообще хранить большой объем данных в конкретном столбце.

Если вы объявите столбец, который никогда не будет должным образом хранить много данных (т.е.имя сотрудника в виде VARCHAR(1000)), в конечном итоге вы столкнетесь с целым рядом проблем

  1. Многие, если не большинство клиентских API (т.е.Драйверы ODBC, драйверы JDBC и т.д.) выделяют буферы памяти на клиенте, которые достаточно велики для хранения максимального размера определенного столбца.Таким образом, даже несмотря на то, что база данных должна хранить только фактические данные, вы можете существенно увеличить объем памяти, используемый клиентским приложением.
  2. Вы теряете возможность управлять правилами проверки данных (или передавать информацию о данных) из определения таблицы.Если база данных допускает имена из 1000 символов, то каждое приложение, взаимодействующее с базой данных, вероятно, в конечном итоге будет иметь свои собственные правила относительно того, насколько большим может быть имя сотрудника.Если это не смягчается путем размещения уровня хранимых процедур между всеми приложениями и таблицами, это обычно приводит к тому, что различные приложения будут иметь разные правила.
  3. Закон Мерфи гласит, что если вы разрешаете 1000 символов, кто-то в конечном итоге сохранит 1000 символов в столбце или, по крайней мере, значение, достаточно большое, чтобы вызвать ошибки в одном или нескольких приложениях (т.е.никто не проверял, может ли поле имени сотрудника каждого приложения содержать 1000 символов).

Другие советы

Зависит от СУБД.IIRC, MySQL выделяет служебные данные в 2 байта для переменных > 255 символов (для отслеживания длины переменной).MSSQL <= 2000 позволило бы вам выделить размер строки > 8060 байт, но потерпело бы неудачу, если бы вы попытались ВСТАВИТЬ или ОБНОВИТЬ строку, которая на самом деле превысила 8060 байт.SQL 2005[1] разрешает вставку, но выделит новую страницу для переполнения и оставит указатель позади.Это, очевидно, влияет на производительность.

[1] varchar(max) - это в некотором роде особый случай, но он также выделит страницу переполнения, если длина поля > 8000 или строки > 8060.Это относится к MSSQL по умолчанию, и поведение может измениться с помощью опции "Большие типы в строке данных".

Вы могли бы добавить риск взлома вашего приложения, если бы в него каким-то образом попали большие данные (например, из внешнего интерфейса), а ваше приложение не предназначено для их обработки.

В качестве хорошего дизайна вы всегда должны ограничивать размер полей реалистичным значением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top