Jaka jest różnica między VARCHAR a CHAR?


366

Jaka jest różnica między VARCHAR i CHAR w MySQL?

Próbuję przechowywać skróty MD5.


15
Skrót MD5 ma zawsze 32 znaki. Dlatego, aby zmaksymalizować wydajność, użyj CHAR (32), ponieważ CHAR ma stałą długość (zobacz odpowiedzi poniżej, aby uzyskać więcej szczegółów na temat różnic między CHAR i VARCHAR).
Augustin

Odpowiedzi:


361

VARCHAR ma zmienną długość.

CHAR ma stałą długość.

Jeśli Twoje treści mają ustalony rozmiar, uzyskasz lepszą wydajność CHAR.

Zobacz stronę MySQL na temat typów CHAR i VARCHAR, aby uzyskać szczegółowe wyjaśnienie (koniecznie przeczytaj również komentarze).


51
@steven: when Anon. mówi „Twoja treść ma stały rozmiar”, co oznacza, że ​​wiersze tabeli muszą zawierać wszystkie pola o stałym rozmiarze. Nie uzyskasz poprawy wydajności, jeśli użyjesz CHAR przeciwko VARCHAR w jednym polu, ale tabela zawiera inne pola, które są VARCHAR.
Marco Demaio

2
brak typu danych char dodaje wydajność ... podczas wykonywania zapytania sql wygeneruje plan wykonania. Załóżmy, że istnieją 2 kolumny charcol char (2000) i VarcharCol Varchar (2000). W planie wykonania szacowany rozmiar wiersza dla kolumn typu varchar może być niedoszacowany. w ten sposób prowadzi wyciek do temp db. Zatem użycie char jest dobre dla wydajności
vignesh

1
jakie jest znaczenie wartości w nawiasie VARCHAR (n)?
Sivagami Nambi

@Marco Demaio, czy znasz przyczynę tego?
Dehan de Croos

1
@ jdc91: aby zwiększyć wydajność, cały wiersz musi mieć stałą szerokość. MySQL zyskuje przewagę, obliczając wymagania dotyczące miejsca i przesunięcia wierszy w tego rodzaju tabelach.
Marco Demaio

225

ZWĘGLAĆ

  1. Służy do przechowywania wartości ciągu znaków o stałej długości .
  2. Maksymalna liczba znaków, które typ danych może przechowywać to 255 znaków .
  3. Jest o 50% szybszy niż VARCHAR.
  4. Wykorzystuje statyczny przydział pamięci .

VARCHAR

  1. Służy do przechowywania danych alfanumerycznych o zmiennej długości .
  2. Maksymalnie może pomieścić ten typ danych
    • Pre-MySQL 5.0.3: 255 znaków .
    • Post-MySQL 5.0.3: 65 535 znaków udostępnionych dla wiersza.
  3. Jego wolniejszy niż CHAR.
  4. Wykorzystuje dynamiczną alokację pamięci .

3
Jestem nieco zaskoczony, że ta odpowiedź była tak często oceniana. Dokumentacja MySQL stwierdzaValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
nie wspominając już o tym, że możesz przechowywać dane alfanumeryczne również w char
ninjabber,

44
Na czym polega to 50% szybciej? 50% szybciej, aby zrobić co? W jakich warunkach? A co w tym kontekście rozumiesz przez alokację pamięci statycznej vs. dynamiczną?
Martin Smith,

4
@MartinSmith Chciałem zapytać o to samo .. nie sądzę, że informacje są dokładne. asktom.oracle.com/pls/asktom/…
Ozgur Bar

2
-1; twierdzenia dotyczące wydajności są tutaj niejasne i nieuzasadnione, różnica w strategii alokacji pamięci (i dlaczego ma to znaczenie) nie jest rozwinięta, a twierdzenie, że varchar przechowuje „dane alfanumeryczne” jest nieco dziwne; W kolumnach varchar z pewnością można również przechowywać znaki niealfanumeryczne!
Mark Amery

122

CHAR Vs VARCHAR

CHAR służy do zmiennej wielkości o stałej długości
VARCHAR jest używany do zmiennej długości zmiennej wielkości.

Na przykład

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

Wyjście będzie

length(City)          Length(street)
10                    6

Wniosek: Aby efektywnie wykorzystać przestrzeń dyskową, należy użyć VARCHAR Zamiast CHAR, jeśli zmienna długość jest zmienna


4
Miasto = char (10), Ulica = varchar (10), miasto = Pune, ulica = Oxford, długość (miasto) = 4, długość (ulica) = 6
abdulwadood

2
to zapytanie (wybierz długość (miasto), długość (ulica) od temp) daje następujące dane wyjściowe w mysql 5,7 mysql> wybierz długość (miasto), długość (ulica) od temp; + -------------- + ---------------- + | długość (miasto) | długość (ulica) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 rząd w zestawie (0,00 s)
Jasbeer Rawal

69

CHAR(x)Kolumna może mieć tylko dokładnie x znaków. Kolumna może mieć maksymalnie znaków.
VARCHAR(x) x

Ponieważ twoje skróty MD5 będą zawsze tego samego rozmiaru, prawdopodobnie powinieneś użyć CHAR .

Jednak nie powinieneś używać MD5; zna słabości.
Zamiast tego użyj SHA2.
Jeśli masz hashujące hasła, powinieneś użyć bcrypt.


44
„Kolumna CHAR (x) może mieć tylko dokładnie x znaków.”. W rzeczywistości możesz dodawać dane z mniej niż x znakami, ale myślę, że miałeś na myśli, że zawsze RESERVES 10 scen wartych pamięci.
Dan W.

13
Nie wiesz, dlaczego przechowują skróty MD5, istnieje wiele, wiele ważnych powodów, aby używać MD5, które nie mają nic wspólnego z bezpieczeństwem. Zderzenia wcale nie są powszechne, a algorytm jest szybszy niż bezpieczniejszy.
John Hunt

1
Zakładając, że kolumna CHAR (x) nie wymusza dokładnie znaków x, czy jest jakiś powód, aby używać jej w VARCHAR (x), nawet w przypadku danych o stałym rozmiarze?
NeverEndingQueue

11

Jaka jest różnica między VARCHAR i CHAR w MySQL?

Do już udzielonych odpowiedzi chciałbym dodać, że w systemach OLTP lub w systemach z częstymi aktualizacjami rozważ użycie CHARnawet dla kolumn o zmiennej wielkości z powodu możliwego VARCHARfragmentacji kolumn podczas aktualizacji.

Próbuję przechowywać skróty MD5.

Skrót MD5 nie jest najlepszym wyborem, jeśli bezpieczeństwo naprawdę ma znaczenie. Jeśli jednak użyjesz dowolnej funkcji skrótu, rozważ BINARYzamiast niej jej typ (np. MD5 wygeneruje 16-bajtowy skrót, więc BINARY(16)wystarczyłoby zamiast CHAR(32)32 znaków reprezentujących cyfry szesnastkowe. Pozwoliłoby to zaoszczędzić więcej miejsca i zwiększyć wydajność.


Zgodnie z tym tokiem myślenia użyłbym CHAR dla identyfikatorów biznesowych, które mają na celu zapewnienie czytelności w porównaniu do wydajności. Nadal jednak używałbym kluczy głównych bigint.
Archimedes Trajano

9

Varchar odcina końcowe spacje, jeśli wprowadzone znaki są krótsze niż zadeklarowana długość, a char nie. Char będzie wstawiał spacje i zawsze będzie miał długość deklarowaną. Pod względem wydajności, varchar jest bardziej biegły, ponieważ przycina znaki, aby umożliwić większą regulację. Jeśli jednak znasz dokładną długość char, char wykona się z nieco większą prędkością.


7

W większości współczesnych RDBMS są to synonimy. Jednak w przypadku systemów, które nadal mają rozróżnienie, pole CHAR jest przechowywane jako kolumna o stałej szerokości. Jeśli zdefiniujesz go jako CHAR (10), w tabeli zostanie zapisanych 10 znaków, w których „padding” (zazwyczaj spacje) jest używany do wypełnienia dowolnego miejsca, którego dane nie zajmują. Na przykład zapisanie „bob” zostanie zapisane jako („bob” +7 spacji). Kolumna VARCHAR (znak zmiennej) służy do przechowywania danych bez marnowania dodatkowego miejsca, które zajmuje kolumna CHAR.

Jak zawsze Wikipedia mówi głośniej.


5

CHAR jest polem o stałej długości; VARCHAR jest polem o zmiennej długości. Jeśli przechowujesz ciągi o bardzo zmiennej długości, takie jak nazwy, użyj VARCHAR, jeśli długość jest zawsze taka sama, użyj CHAR, ponieważ jest nieco bardziej wydajny pod względem rozmiaru, a także nieco szybszy.


Chociaż przypuszczam, że twierdzenia o szybkości i wydajności przechowywania są tutaj prawdziwe, żadne z nich nie jest w żaden sposób uzasadnione (i jest całkowicie prawdopodobne, że są fałszywe), co czyni tę odpowiedź nieprzydatną; po prostu powtarza to, co czytelnik prawdopodobnie już spodziewałby się prawdy, nie robiąc nic, co naprawdę pomogłoby to potwierdzić.
Mark Amery

1

CHAR ma stałą długość, a VARCHAR ma zmienną długość. CHAR zawsze wykorzystuje tę samą ilość miejsca do przechowywania na pozycję, podczas gdy VARCHAR wykorzystuje tylko ilość niezbędną do przechowywania rzeczywistego tekstu.


1

Char jest typem danych znakowych o stałej długości, varchar jest typem danych znakowych o zmiennej długości.

Ponieważ char jest typem danych o stałej długości, rozmiar pamięci wartości char jest równy maksymalnemu rozmiarowi dla tej kolumny. Ponieważ varchar jest typem danych o zmiennej długości, rozmiar pamięci wartości varchar to rzeczywista długość wprowadzonych danych, a nie maksymalny rozmiar dla tej kolumny.

Możesz użyć znaku, gdy oczekuje się, że wpisy danych w kolumnie będą tego samego rozmiaru. Możesz użyć varchar, gdy oczekuje się, że wpisy danych w kolumnie będą się znacznie różnić.


0

według książki High Performance MySQL :

VARCHAR przechowuje ciągi znaków o zmiennej długości i jest najczęstszym typem ciągu znaków. Może wymagać mniej miejsca do przechowywania niż typy o stałej długości, ponieważ zużywa tylko tyle miejsca, ile potrzebuje (tj. Mniej miejsca jest używane do przechowywania krótszych wartości). Wyjątkiem jest tabela MyISAM utworzona za pomocą ROW_FORMAT = FIXED, która wykorzystuje stałą ilość miejsca na dysku dla każdego wiersza i może w ten sposób marnować miejsce. VARCHAR poprawia wydajność, ponieważ oszczędza miejsce.

CHAR ma stałą długość: MySQL zawsze przydziela wystarczającą ilość miejsca dla określonej liczby znaków. Podczas przechowywania wartości CHAR MySQL usuwa spacje końcowe. (Tak było również w przypadku VARCHAR w MySQL 4.1 i starszych wersjach - CHAR i VAR CHAR były logicznie identyczne i różniły się tylko formatem pamięci.) Wartości są wypełniane spacjami stosownie do potrzeb dla porównań.


2
VARCHAR pomaga wydajności, ponieważ oszczędza miejsce ” Oszczędza miejsce, tak, ale czy nie wpływa negatywnie na wydajność? VARCHARpotrzebuje dynamicznie przydzielać pamięć, gdy jest to wymagane, a tym samym zmniejszać wydajność w przeciwieństwie do CHAR, prawda?
Spikatrix

@Spikatrix Zależy. Jeśli wartości VARCHAR są często małe, ale mogą wynosić do N bajtów, dynamiczny przydział może zaoszczędzić znaczną ilość miejsca i operacji we / wy, co jest bardziej wydajne w przypadku dużej ilości danych. Wartości CHAR, które są mniej więcej równe długości, byłyby bardziej wydajne. Odczyty i zapisy również prawdopodobnie mają znaczenie.
Andrew

-4

Char ma stałą długość (obsługuje 2000 znaków), oznacza, że ​​znak jest typem danych

Varchar ma zmienną długość (obsługuje 4000 znaków)


-1; te liczby nie są poprawne dla MySQL. (Myślę, że mogą być dla Oracle?)
Mark Amery

-5

Char lub varchar - służy do wprowadzania danych tekstowych, w których długość może być podana w nawiasach Eg- nazwa char (20)


To nie dotyczy pierwotnego pytania. OP pyta o praktyczne różnice między typami, a nie o składnię i cel typów. Także (i )są nawiasami, a nie nawiasami.
2mac

@ 2mac twoje ostatnie zdanie dotyczy tylko amerykańskiego angielskiego; w Wielkiej Brytanii nazywamy (i )wsporniki i wielu Brytyjczyków prawdopodobnie nie zdają sobie nawet sprawy, że są dialekty języka angielskiego, w którym słowo „nawias” może odnosić się do znaku interpunkcyjnym. Należy zdecydować się na preferowanie „nawiasów” zamiast „nawiasów” - prawdopodobnie jest to maksymalnie jasna opcja przy docieraniu do międzynarodowej grupy programistów - ale jest to bardziej skomplikowany przypadek niż „nawiasy” po prostu mylne.
Mark Amery

-11

CHAR:

  • Obsługuje zarówno postać, jak i liczby.
  • Obsługuje 2000 znaków.
  • Poprawiona długość.

VARCHAR:

  • Obsługuje zarówno postać, jak i liczby.
  • Obsługuje 4000 znaków.
  • Zmienna długość.

jakieś komentarze ...... !!!!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.