Розуміння варчарського (макс.) Стовпчика 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 для читання даних до цього стовпця завжди повертає повний результат із 100 000+ символами?


Зауважте, що varchar(max)колись викликали textі трактувались як інший тип даних.
Містер Лістер

Може, прочитати це ? Це стосується розмірів сторінок 8K. Значення, занадто великі для розміщення на одній сторінці (обмеження насправді трохи більше 8000), зберігаються на сторінках LOB_DATA (Large OBject).
Джастін

Відповіді:


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 символів можуть прийти в гру. Потрібно бути в курсі посилань на точність, масштаб та довжину (Transact-SQL) про char, nchar, nvarchar та varchar. Навпаки, встановлення n до max (без лапок) змушує SQL Server зберігати (і повертати) максимальну кількість байтів (як зазначено у вашій цитаті).

Питання 2: чи завжди запит .net для читання даних до цього стовпця завжди повертає повний результат із 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 (таким чином, значна частина нашого користувачі світу не зможуть бачити своїх локалізованих / рідних символів у вашому додатку).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.