Zrozumienie kolumny varchar (max) 8000 i dlaczego mogę przechowywać w niej ponad 8000 znaków

13

Z tego dokumentu Microsoft +

n określa długość łańcucha i może mieć wartość od 1 do 8 000. max oznacza, że ​​maksymalny rozmiar pamięci to 2 ^ 31-1 bajtów (2 GB). Rozmiar pamięci to faktyczna długość wprowadzonych danych + 2 bajty.

Pomóż mi to zrozumieć.

Wydaje się, że maksymalna liczba znaków w varchar 8000jest o wiele mniejsza niż 2GBwartość danych.

Widzę, że w tej varchar(max)kolumnie znajdują się rekordy, które mają len(mycolumn)> 100 000. Wiem więc, że mogę 8000umieścić w varchar(max)kolumnie znacznie więcej niż znaki .

Pytanie 1: W jaki sposób 8000postacie wchodzą w grę i gdzie powinienem być tego świadomy?

Pytanie 2 : czy zapytanie bazy danych .net do tej kolumny zawsze zwróci pełny wynik zawierający ponad 100 000 znaków?

Peter PitLock
źródło
Zauważ, że varchar(max)kiedyś był wywoływany texti był traktowany jako inny typ danych.
Pan Lister
Może to przeczytasz ? Jest to związane z rozmiarami stron 8K. Wartości zbyt duże, aby zmieściły się na jednej stronie (limit jest faktycznie nieco większy niż 8000) są zapisywane na stronach LOB_DATA (Large OBject).
Justin

Odpowiedzi:

30

Rozumiem, dlaczego nie rozumiesz tego - to trochę trudne. Wszystkie są ważne:

  • VARCHAR (1) - ciąg jednego znaku
  • VARCHAR (4000) - 4000 znaków
  • VARCHAR (8000) - 8000 znaków - a jeśli użyjesz liczby do zdefiniowania tego pola, jest to najwyższy NUMER, jakiego możesz użyć, ale zobacz to:
  • VARCHAR (MAX) - ten mieści do 2 GB.

I tak, jeśli spróbujesz wydobyć dane z pola VARCHAR (MAX), a ktoś zapisze tam 2 GB, zapnij pasy.

Brent Ozar
źródło
3
and somebody stored 2GB in there, buckle up.- Byłem tam z kilkoma plikami blob
Ruslan
7

Pytanie 1: W jaki sposób wchodzi 8000 postaci i gdzie powinienem być tego świadomy?

Ustawienie n na 8000 powoduje włączenie 8000 znaków. Musisz być świadomy odwołań do Precision, Scale i Length (Transact-SQL) na temat char, nchar, nvarchar i varchar. Natomiast ustawienie n na maksimum (bez cudzysłowów) powoduje, że SQL Server przechowuje (i zwraca) maksymalną liczbę bajtów (jak wspomniano w cytacie).

Pytanie 2: czy zapytanie bazy danych .net do tej kolumny zawsze zwróci pełny wynik zawierający ponad 100 000 znaków?

To jest pytanie .Net (nie SQL Server), ale moduł danych .Net pobiera strumień bajtów. Bajt nie jest znakiem, a SQL Server zwraca bajty (nie znaki). Jeśli n jest ustawione na 8000, a typ danych to nvarchar, SQL Server zwraca do 8000 bajtów, które moduł danych .Net może interpretować jako 4000 znaków Unicode. Jeśli n jest ustawione na 8000, a typ danych to varchar, SQL Server zwraca do 8000 bajtów, które moduł danych .Net może interpretować jako do 8000 znaków ANSI. Jeśli n jest ustawione na maks., A typ danych to nvarchar, SQL Server zwraca do 2 ^ 31-1 bajtów, które lider danych .Net może interpretować jako do (2 ^ 31-1) / 2 znaków. Jeśli n jest ustawione na maks., A typ danych to varchar, SQL Server zwraca do 2 ^ 31-1 bajtów, które moduł danych .Net może interpretować jako do 2 ^ 31-1 znaków ANSI.

Jeśli wybierzesz opcję char lub varchar (zamiast nchar lub nvarchar), ponieważ mogą one przechowywać więcej „znaków” (dokładniej: bajtów), musisz pamiętać, że wiele znaków Unicode nie ma równoważnych znaków ANSI (a zatem duża część naszych użytkownicy na całym świecie nie będą mogli zobaczyć swoich zlokalizowanych / rodzimych znaków w Twojej aplikacji).

Rachunek
źródło