В MS SQL Server (7.0 и более поздних версиях) данные varchar внутренне представлены тремя значениями:
- Фактическая строка символов, которая будет от 0 до более чем 8000 байтов (это зависит от размера страницы, других столбцов, сохраненных для строки, и нескольких других факторов)
- Два байта используются для указания длины строки данных (которая дает значение от 0 до 8000 +)
- Если столбец имеет значение NULL, один бит в нулевой битовой маске строки (поэтому нулевой статус до восьми NULL-столбцов может быть представлен одним байтом)
Важной частью является двухбайтовый индикатор длины данных. Если бы это был один байт, вы могли бы правильно записать только строки длиной от 0 до 255; с двумя байтами вы можете записать строки длиной от 0 до 64000+ (в частности, 2 ^ 16 -1). Тем не менее, длина страницы SQL Server составляет 8 КБ, отсюда и ограничение в 8000 символов. (В SQL 2005 есть переполнение данных, но если ваши строки будут такими длинными, вам нужно просто использовать varchar (max).)
Итак, независимо от того, как долго вы объявляете столбец типа данных varchar (15, 127, 511), на самом деле вы будете хранить для каждой строки:
- 2 байта для указания длины строки
- Фактическая строка, то есть количество символов в этой строке
Что подводит меня к моему мнению: многие старые системы использовали только 1 байт для хранения длины строки, и это ограничивало вас максимальной длиной 255 символов, что не так уж и долго. С 2 байтами у вас нет такого произвольного ограничения ... и поэтому я рекомендую выбрать число, которое имеет смысл (предположительно нетехнически ориентированному) пользователю. Мне нравятся 50, 100, 250, 500 и даже 1000. Учитывая, что база хранения объемом 8000+ байтов, 255 или 256 столь же эффективна, как 200 или 250, и меньше , когда дело доходит до объяснить вещи конечным пользователям.
Это относится к однобайтовым данным (т. Е. Ansii, SQL _ Latin1 * _ * General_CP1 и др.). Если вам нужно хранить данные для нескольких кодовых страниц или языков, используя разные алфавиты, вам нужно работать с типом данных nvarchar (который, я думаю, работает одинаково, два байта для числа символов, но для каждого действительного символа данных требуется два байты памяти). Если у вас есть строки, которые могут превышать 8000 или более 4000 в nvarchar, вам нужно будет использовать типы данных [n] varchar (max).
И если вы хотите знать, почему так важно занимать место с дополнительными байтами, просто чтобы отследить, насколько длинны данные, посмотрите http://www.joelonsoftware.com/articles/fog0000000319.html
Philip