Понимание столбца varchar (max) 8000 и почему я могу хранить в нем более 8000 символов

13

Из этого документа Microsoft, +

n определяет длину строки и может принимать значение от 1 до 8000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ). Размер хранилища - это фактическая длина введенных данных + 2 байта.

Пожалуйста, помогите мне понять это.

Максимальное количество символов для varchar, по-видимому 8000, намного меньше, чем 2GBценность данных.

Я вижу, что в этом varchar(max)столбце конкретной таблицы есть записи, которые имеют len(mycolumn)> 100 000. Таким образом, я знаю, что могу получить 8000в varchar(max)столбце гораздо больше символов, чем символов .

Вопрос 1: Как 8000персонажи вступают в игру и где я должен знать об этом?

Вопрос 2 : будет ли запрос к .net datareader к этому столбцу всегда возвращать полный результат со 100 000+ символами?

Питер Питлок
источник
Обратите внимание, что varchar(max)когда-то вызывался textи обрабатывался как другой тип данных.
Мистер Листер
Может читать это ? Это связано с размерами страниц 8K. Значения, слишком большие для размещения на одной странице (ограничение на самом деле немного больше 8000), сохраняются на страницах LOB_DATA (Большой объект).
Джастин

Ответы:

30

Я понимаю, почему вы неправильно это понимаете - это немного сложно. Все они действительны:

  • VARCHAR (1) - строка из одного символа
  • VARCHAR (4000) - 4000 знаков
  • VARCHAR (8000) - 8000 символов - и если вы используете число для определения этого поля, это наибольшее число, которое вы можете использовать, но посмотрите это:
  • VARCHAR (MAX) - тот, который вмещает до 2 ГБ.

И да, если вы пытаетесь получить данные из поля VARCHAR (MAX), и кто-то хранит там 2 ГБ, пристегнитесь.

Брент Озар
источник
3
and somebody stored 2GB in there, buckle up.- Был там с несколькими файлами блобов
Руслан
7

Вопрос 1: Как 8000 персонажей вступают в игру и где я должен знать об этом?

При установке n на 8000 в игру вступает 8000 символов. Вы должны знать о ссылках Precision, Scale и Length (Transact-SQL) о char, nchar, nvarchar и varchar. Напротив, если задать для параметра n значение max (без кавычек), SQL Server сохранит (и вернет) максимальное количество байтов (как указано в вашей цитате).

Вопрос 2: будет ли запрос к .net datareader к этому столбцу всегда возвращать полный результат со 100 000+ символами?

Это вопрос .Net (не SQL Server), но устройство чтения данных .Net извлекает поток байтов. Байт не является символом, и SQL Server возвращает байты (не символы). Если для n установлено значение 8000, а тип данных - nvarchar, SQL Server возвращает до 8000 байтов, что может интерпретировать устройство чтения данных .Net как 4000 символов Unicode. Если n установлено равным 8000, а тип данных - varchar, SQL Server возвращает до 8000 байт, что может интерпретировать устройство чтения данных .Net длиной до 8000 символов ANSI. Если для n задано значение max, а тип данных - nvarchar, SQL Server возвращает до 2 ^ 31-1 байт, что может интерпретировать устройство чтения данных .Net длиной до (2 ^ 31-1) / 2 символа. Если для n задано значение max, а тип данных - varchar, SQL Server возвращает до 2 ^ 31-1 байт, что может интерпретировать устройство чтения данных .Net до 2 ^ 31-1 символов ANSI.

Если вы решите использовать char или varchar (вместо nchar или nvarchar), потому что они могут хранить больше «символов» (точнее, байтов), вам нужно знать, что многие символы Unicode не имеют эквивалентных символов ANSI (таким образом, большая часть нашего пользователи всего мира не смогут увидеть свои локализованные / нативные символы в вашем приложении).

Билл
источник