Typ tekstowy SQL Server a typ danych varchar [zamknięte]

287

Mam dane o zmiennej długości i chcę przechowywać w bazie danych SQL Server (2005). Chcę poznać najlepsze praktyki dotyczące wyboru typu TEKSTOWEGO SQL lub typu VARCHAR SQL, plusy i minusy w zakresie wydajności / śladu / funkcji.

George2
źródło
17
Jeśli Google Cię tu przysłał: strona Typy danych SQL MSDN może pomóc.
Jeroen

Odpowiedzi:

212

Jeśli używasz programu SQL Server 2005 lub nowszego, użyj varchar(MAX). Typ textdanych jest przestarzały i nie należy go używać do nowych prac programistycznych. Z dokumentów :

Ważny

ntext, texti imagetypy danych zostaną usunięte w przyszłej wersji Microsoft SQL Server. Unikaj używania tych typów danych w nowych pracach programistycznych i planuj modyfikowanie aplikacji, które ich obecnie używają. Zamiast tego używaj nvarchar (max) , varchar (max) i varbinary (max) .

Mladen Prajdic
źródło
3
Dzięki Mladen, jestem zaskoczony, że TEXT jest przestarzały. Czy masz jakieś oficjalne dokumenty na ten temat?
George2
1
Chociaż nie jest to „oficjalne”, obejmuje ono podstawy. Tekst jest w rzeczywistości amortyzowany, a także nie obsługuje wszystkiego, co robi varchar (maks.), Np. Możliwości wyszukiwania i indeksowania. blog.sqlauthority.com/2007/05/26/…
achinda99
32
to jest tak oficjalne, jak to tylko możliwe :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic
1
Fajne achinda99 i Mladen Prajdic! To, co dostarczyłeś, jest tym, czego szukam. :-) Jeszcze jedno pytanie, jak wybrać, czy używać VARCHAR, czy VARCHAR (MAX) w różnych sytuacjach?
George2
1
Oficjalne informacje na ten temat MS są nieaktualne: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
283

TEXTjest używany do dużych fragmentów danych łańcuchowych. Jeśli długość pola przekracza określony próg, tekst jest zapisywany poza wierszem.

VARCHARjest zawsze przechowywany w rzędzie i ma limit 8000 znaków. Jeśli spróbujesz utworzyć VARCHAR(x), gdzie x> 8000 , pojawi się błąd:

Serwer: Msg 131, poziom 15, stan 3, wiersz 1

Rozmiar () nadany typowi „varchar” przekracza maksimum dozwolone dla dowolnego typu danych (8000)

Te ograniczenia nie dotyczą długości VARCHAR(MAX)w SQL Server 2005 , które mogą być przechowywane z rzędu, podobnie jak TEXT.

Zauważ, że MAXnie jest to rodzaj stałej tutaj VARCHARi VARCHAR(MAX)są to bardzo różne typy, przy czym te ostatnie są bardzo zbliżone TEXT.

We wcześniejszych wersjach programu SQL Server nie można było uzyskać TEXTbezpośredniego dostępu , można było tylko uzyskać TEXTPTRi używać go READTEXToraz WRITETEXTfunkcji.

W SQL Server 2005 możesz bezpośrednio uzyskać dostęp do TEXTkolumn (choć nadal potrzebujesz jawnego rzutowania, VARCHARaby przypisać im wartość).

TEXT jest dobry:

  • Jeśli chcesz przechowywać duże teksty w bazie danych
  • Jeśli nie wyszukujesz wartości kolumny
  • Jeśli wybierzesz tę kolumnę rzadko i nie dołączasz do niej.

VARCHAR jest dobry:

  • Jeśli przechowujesz małe sznurki
  • Jeśli szukasz wartości ciągu
  • Jeśli zawsze wybierzesz go lub użyjesz w złączeniach.

Przez wybranie tutaj mam na myśli wydając jakieś pytania, które zwracają wartość kolumny.

Przez poszukiwanie tutaj mam na myśli wydając jakieś pytania, których wynik zależy od wartości TEXTlub VARCHARkolumnie. Obejmuje to używanie go w dowolnym stanie JOINlub WHEREstanie.

Ponieważ dane TEXTsą przechowywane poza wierszem, zapytania nie obejmujące TEXTkolumny są zwykle szybsze.

Kilka przykładów tego, co TEXTjest dobre dla:

  • Komentarze na blogu
  • Strony Wiki
  • Źródło kodu

Kilka przykładów tego, co VARCHARjest dobre dla:

  • Nazwy użytkowników
  • Tytuły stron
  • Nazwy plików

Zasadniczo, jeśli kiedykolwiek potrzebujesz wartości tekstowej przekraczającej 200 znaków ORAZ nie używaj łączenia w tej kolumnie, użyjTEXT .

W przeciwnym razie użyj VARCHAR.

PS To samo dotyczy UNICODEwłączonych, NTEXTa NVARCHARtakże, których należy użyć w powyższych przykładach.

PPS To samo dotyczy VARCHAR(MAX)i NVARCHAR(MAX)że SQL Server 2005+ zastosowań zamiast TEXTa NTEXT. Musisz włączyć large value types out of rowdo nich sp_tableoption, jeśli chcesz, żeby być zawsze przechowywany z rzędu.

Jak wspomniano powyżej i tutaj , TEXTw przyszłych wydaniach będzie przestarzały:

text in rowOpcja zostanie usunięta w przyszłej wersji z SQL Server . Unikaj korzystania z tej opcji w nowych pracach programistycznych i planuj modyfikować obecnie używane aplikacje text in row. Zaleca się przechowywanie dużych ilości danych za pomocą varchar(max), nvarchar(max)lub varbinary(max)typów danych. Aby kontrolować zachowanie tych typów danych w wierszu i poza wierszem, użyj large value types out of rowopcji.

Quassnoi
źródło
2
1. „Jeśli nie wyszukujesz wartości kolumny” - czy możesz mi pokazać, co masz na myśli „szukaj”? Masz na myśli wybranie tej kolumny, zamówienie tej kolumny, PODOBNE dla tej kolumny lub użycie funkcji manipulacji ciągiem w tej kolumnie?
George2
2
2. „VARCHAR jest zawsze przechowywany w rzędzie i ma limit 8000 znaków.” - przepraszam, nie zgadzam się z tobą. VARCHAR może być dłuższy niż 8000, a jeśli dłuższy niż 8000, VARCHAR będzie przechowywany inaczej niż w kolumnach. Jakieś komentarze?
George2
1
3. Mladen Prajdic wspomniany w tym wątku, typ TEKSTU jest przestarzały, ale nie znalazłem żadnych dokumentów na ten temat. Czy masz jakieś dokumenty na ten temat?
George2
2
Fajne Quassnoi! Jesteś tak kompetentny! :-) Jeszcze jedno pytanie - „To oczywiście nie dotyczy VARCHAR (MAX), który jest jak SQL Server 2005 synonimem TEKSTU”. „To” masz na myśli co?
George2
„Nie dotyczy to oczywiście VARCHAR (MAX), który podobnie jak SQL SERVER 2005 jest synonimem TEKSTU.” - czy masz jakieś dokumenty stwierdzające, że TEKST jest taki sam jak VARCHAR w SQL Server 2005? Przeprowadziłem wyszukiwanie, ale nie mogę znaleźć oficjalnych dokumentów. :-)
George2
41

W SQL Server 2005 wprowadzono nowe typy danych: varchar(max)i nvarchar(max) mają zalety starego typu tekstu: mogą zawierać do 2 GB danych, ale mają także większość zalet varchari nvarchar. Wśród tych zalet jest możliwość korzystania z funkcji manipulacji ciągami, takich jak substring ().

Ponadto varchar (max) jest przechowywany w przestrzeni tabeli (dysku / pamięci), podczas gdy rozmiar jest mniejszy niż 8 KB. Tylko wtedy, gdy umieścisz więcej danych w polu, są one przechowywane poza obszarem tabeli. Dane przechowywane w obszarze tabeli są (zwykle) szybciej pobierane.

Krótko mówiąc, nigdy nie używaj tekstu, ponieważ istnieje lepsza alternatywa: (n) varchar (max). I używaj varchar (maks.), Gdy zwykły varchar nie jest wystarczająco duży, tj. Jeśli spodziewasz się, że ciąg, który zamierzasz przechowywać, przekroczy 8000 znaków.

Jak zauważono, możesz użyć SUBSTRING na typie danych TEKST, ale tylko tak długo, jak długo pola TEKST zawierają mniej niż 8000 znaków.

edosoft
źródło
1
Dzięki Edoode, odpowiedziałeś całkiem dobrze, jak dobry jest VARCHAR, ale jakieś uwagi lub pomysły na temat tego, kiedy używać VARCHAR, a kiedy TEKST? Moje pytanie dotyczy wyboru numeru 1 z 2. :-)
George2
1
W rzeczywistości w MS SQL Server 2005 można także używać SUBSTRING i innych funkcji w kolumnach TEXT.
Quassnoi
1
Dzięki Quassnoi! Wygląda na to, że TEKST jest przestarzały. Jeszcze jedno pytanie, jak wybrać, czy używać VARCHAR, czy VARCHAR (MAX) w różnych sytuacjach?
George2
1
Używaj varchar (max) tylko wtedy, gdy zwykły varchar nie jest wystarczająco duży (8Kb powinno wystarczyć dla wszystkich;)
edosoft 20.02.2009
7

Nastąpiły pewne poważne zmiany w ms 2008 -> Przy podejmowaniu decyzji o tym, jakiego typu danych użyć, warto rozważyć poniższy artykuł. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bajtów na

  1. kolumna varchar (maks.), varbinary (maks.), xml, text lub image 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (max) kolumna 2 ^ 30-1 2 ^ 30-1
Draz
źródło
3
Zmiany? Te zdolności nie uległy zmianie od czasu wprowadzenia nowych typów danych.
Martin Smith