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 8000
jest o wiele mniejsza niż 2GB
wartość danych.
Widzę, że w tej varchar(max)
kolumnie znajdują się rekordy, które mają len(mycolumn)
> 100 000. Wiem więc, że mogę 8000
umieścić w varchar(max)
kolumnie znacznie więcej niż znaki .
Pytanie 1: W jaki sposób 8000
postacie 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?
sql-server
varchar
max
Peter PitLock
źródło
źródło
varchar(max)
kiedyś był wywoływanytext
i był traktowany jako inny typ danych.Odpowiedzi:
Rozumiem, dlaczego nie rozumiesz tego - to trochę trudne. Wszystkie są ważne:
I tak, jeśli spróbujesz wydobyć dane z pola VARCHAR (MAX), a ktoś zapisze tam 2 GB, zapnij pasy.
źródło
and somebody stored 2GB in there, buckle up.
- Byłem tam z kilkoma plikami blobUstawienie 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).
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).
źródło