Недостаток выбора большого значения MAX для varchar или varbinary - PullRequest
4 голосов
/ 24 января 2009

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

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

Спасибо

Ответы [ 3 ]

6 голосов
/ 24 января 2009

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

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

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

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

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

0 голосов
/ 24 января 2009

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

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

...