Ogólną zasadą jest wybranie CHAR jeśli wszystkie wiersze będą miały zbliżoną do tej samej długości . Wybierz VARCHAR (lub NVARCHAR ), gdy długość jest różna znacznie. CHAR może być również nieco szybszy, ponieważ wszystkie wiersze mają tę samą długość.
Różni się w zależności od implementacji bazy danych, ale ogólnie VARCHAR (lub NVARCHAR ) wykorzystuje jeden lub dwa dodatkowe bajty pamięci (dla długości lub zakończenia) oprócz rzeczywistych danych. Tak więc (zakładając, że używasz jednobajtowego zestawu znaków) przechowujesz słowo „FooBar”
- CHAR(6) =6 bajtów (bez narzutu)
- VARCHAR(100) =8 bajtów (2 bajty narzutu)
- CHAR(10) =10 bajtów (4 bajty odpadów)
Dolna linia to CHAR może być szybszym i więcej oszczędnych przestrzeni dla danych o stosunkowo tej samej długości (w ramach różnicy długości dwóch znaków).
Uwaga :Microsoft SQL ma 2 bajty narzutu na VARCHAR. Może się to różnić w zależności od DB do DB, ale generalnie jest co najmniej 1 bajt narzutu potrzebny do wskazania długości lub EOL na VARCHAR.
Jak zauważył Gaven w komentarzach:Rzeczy się zmieniają, jeśli chodzi o zestawy znaków wielobajtowych i jest to przypadek, w którym VARCHAR staje się znacznie lepszym wyborem.
Uwaga o zadeklarowanej długości VARCHAR :Ponieważ przechowuje długość rzeczywistej zawartości, nie marnujesz niewykorzystanej długości. Zatem przechowywanie 6 znaków w VARCHAR(6), VARCHAR(100), lub VARCHAR(MAX) wykorzystuje tę samą ilość miejsca. Przeczytaj więcej o różnicach podczas używania VARCHAR(MAX). Deklarujesz maksimum rozmiar w VARCHAR, aby ograniczyć ilość przechowywanych.
W komentarzach AlwaysLearning wskazał, że dokumentacja Microsoft Transact-SQL wydaje się mówić coś przeciwnego. Sugerowałbym, że to błąd lub przynajmniej dokumenty są niejasne.