Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jakie są przypadki użycia wyboru CHAR nad VARCHAR w SQL?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć przy użyciu INNER JOIN w programie SQL Server?

  2. CTE, aby uzyskać wszystkie dzieci (potomków) rodzica

  3. SQL:Wybierz dynamiczną nazwę kolumny na podstawie zmiennej

  4. Jak zaktualizować dużą tabelę z milionami wierszy w SQL Server?

  5. Microsoft SQL Server 2005/2008:XML a typ danych tekst/varchar