VARCHAR ve CHAR arasındaki fark nedir?


366

MySQL'de VARCHAR ve CHAR arasındaki fark nedir?

MD5 karmalarını depolamaya çalışıyorum.


15
MD5 karması her zaman 32 karakterden oluşur. Bu nedenle, performansınızı en üst düzeye çıkarmak için CHAR sabit uzunlukta olduğundan CHAR (32) kullanın (CHAR ve VARCHAR arasındaki farklar hakkında daha fazla ayrıntı için aşağıdaki cevaplara bakın).
Augustin

Yanıtlar:


361

VARCHAR değişken uzunluktadır.

CHAR sabit uzunluktadır.

İçeriğiniz sabit bir boyutta ise, daha iyi performans elde edersiniz CHAR.

Ayrıntılı bir açıklama için CHAR ve VARCHAR Tipleri'ndeki MySQL sayfasına bakın (yorumları da okuyun).


51
@ steven: Ne zaman Anon. "içeriğiniz sabit bir boyuttur", tablonuzdaki satırların tüm sabit boyut alanlarını içermesi gerektiği anlamına gelir. Bir alanda CHAR'ı VARCHAR'a karşı kullanırsanız performans artışı olmaz, ancak tabloda VARCHAR olan diğer alanlar bulunur.
Marco Demaio

2
hiçbir char veri türü performansı eklemez ... sorgu sql yürütülürken bir yürütme planı oluşturur. 2 sütun charcol char (2000) ve VarcharCol Varchar (2000) olduğunu varsayın. Yürütme planında, varchar tipi sütunlar için tahmini satır boyutu tahmin edilemez. böylece döküntüyü geçici db'ye yönlendirir. Char kullanmak performans için iyi
vignesh

1
VARCHAR (n) 'nin parantezindeki değerin anlamı nedir?
Sivagami Nambi

@Marco Demaio bunun nedenini biliyor musunuz?
Dehan de Croos

1
@ jdc91: performans artışı elde etmek için tüm satır sabit genişlikte olmalıdır. MySQL, bu tür tablodaki alan gereksinimlerini ve satır ofsetini hesaplama avantajı sağlar.
Marco Demaio

225

CHAR

  1. Sabit uzunlukta karakter dizesi değerini saklamak için kullanılır .
  2. Maksimum no. veri türünün tutabileceği karakter sayısı 255 karakterdir .
  3. Bu var % 50 daha hızlı VARCHAR daha.
  4. Statik bellek ayırmayı kullanır .

VARCHAR

  1. Değişken uzunluktaki alfasayısal verileri depolamak için kullanılır .
  2. Bu veri türünün alabileceği maksimum değer
    • Pre-MySQL 5.0.3: 255 karakter .
    • Post-MySQL 5.0.3: Satır için 65.535 karakter paylaşıldı.
  3. Bu var yavaş CHAR daha.
  4. Dinamik bellek ayırma kullanır .

3
Bu cevabın bu kadar sık ​​değerlendirilmesinden biraz şaşırdım. MySQL belgeleri şunu belirtiyorValues 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
alfasayısal verileri
char'da

44
Bu% 50 daha hızlı neye dayanıyor? Ne yapmak için% 50 daha hızlı? Hangi koşullarda? Ve bu bağlamda statik bellek tahsisine karşı dinamik ile ne demek istiyorsun?
Martin Smith

4
@MartinSmith Ben de aynısını soracaktım ... bilgilerin doğru olduğunu düşünmeyin. asktom.oracle.com/pls/asktom/…
Özgür Bar

2
1; buradaki performans iddiaları belirsiz ve asılsız, bellek ayırma stratejisindeki (ve neden önemli olduğu) fark etmedi ve varchar'ın "alfasayısal verileri" depoladığı iddiası biraz garip; varchar sütunları kesinlikle alfasayısal olmayan karakterleri de saklayabilir!
Mark Amery

122

CHAR Vs VARCHAR

CHAR Sabit Uzunluk Boyut Değişkeni
için kullanılır VARCHAR Değişken Uzunluk Boyut Değişkeni için kullanılır.

Örneğin

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

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

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

Çıktı

length(City)          Length(street)
10                    6

Sonuç: Değişken uzunluk değişkense depolama alanını verimli kullanmak için CHAR yerine VARCHAR kullanmalısınız


4
Şehir = karakter (10), Sokak = varchar (10), şehir = Pune, sokak = Oxford, uzunluk (şehir) = 4, uzunluk (sokak) = 6
abdulwadood

2
bu sorgu (uzunluk (şehir), uzunluk (sokak) temp'den seç) mysql 5.7 mysql> uzunluk (şehir), uzunluk (sokak) temp'den aşağıdaki çıktıyı verir; + -------------- + ---------------- + | uzunluk (şehir) | uzunluk (sokak) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + sette 1 satır (0.00 sn)
Jasbeer Rawal

69

Bir CHAR(x)sütunda yalnızca tam x karakterler olabilir.
Bir VARCHAR(x)sütunda en fazla x karakter olabilir.

MD5 karma değerleriniz her zaman aynı boyutta olacağından, muhtemelen bir CHAR.

Ancak, öncelikle MD5 kullanmamalısınız; bilinen zayıflıkları vardır.
Bunun yerine SHA2 kullanın.
Parolaları karmayorsanız, bcrypt kullanmalısınız.


44
Msgstr "Bir CHAR (x) sütununda tam olarak x karakter olabilir." Aslında, x karakterden daha az veri ekleyebilirsiniz, ancak bence her zaman perde arkasında 10 karakter değerinde bellek SUNAR.
Dan W

13
Neden md5 karmaları sakladıklarını bilmiyorsunuz, md5'i güvenlikle ilgisi olmayan birçok geçerli neden var. Çarpışmalar hiç yaygın değildir ve algoritma daha güvenli olanlardan daha hızlıdır.
John Hunt

1
CHAR (x) sütununun x karakterlerini tam olarak uygulamadığını varsayarsak, sabit boyutlu veriler için bile VARCHAR (x) üzerinde kullanmak için herhangi bir neden var mı?
NeverEndingQueue

11

MySQL'de VARCHAR ve CHAR arasındaki fark nedir?

Zaten yanıtlar vermek için, OLTP sistemlerinde veya sık güncellemelere sahip sistemlerde, güncellemeler sırasında CHARolası VARCHARsütun parçalanması nedeniyle değişken boyutlu sütunlar için bile kullanmayı düşünün .

MD5 karmalarını depolamaya çalışıyorum.

Güvenlik gerçekten önemliyse MD5 karma en iyi seçim değildir. Ancak, herhangi bir karma işlev kullanacaksanız, BINARYbunun yerine türü düşünün (örn. MD5 16 baytlık karma üretecektir, bu nedenle onaltılık basamakları temsil eden 32 karakter BINARY(16)yerine yeterli CHAR(32)olacaktır.


Bu düşünce treninden sonra, okunabilirlik ve verimlilik açısından amaçlanan işletme kimlikleri için CHAR'ı kullanacağım. Yine de bigint birincil anahtarları kullanırdım.
Arşimet Trajano

9

Varchar, girilen karakterler belirtilen uzunluktan daha kısaysa arka boşlukları keser, ancak char olmaz. Char boşlukları doldurur ve her zaman belirtilen uzunluğun uzunluğu olur. Verimlilik açısından, varchar karakterleri daha fazla ayarlamaya izin vermek için kırptığı için daha beceriklidir. Ancak, karakter uzunluğunu tam olarak biliyorsanız, karakter biraz daha hızlı çalışacaktır.


7

Bugün birçok RDBMS'de, eşanlamlıdır. Bununla birlikte, hala bir ayrımı olan sistemler için bir CHAR alanı sabit genişlikli sütun olarak saklanır. CHAR (10) olarak tanımlarsanız, tabloya 10 karakter yazılır ve burada verilerin kullanılmadığı boşlukları doldurmak için "dolgu" (genellikle boşluklar) kullanılır. Örneğin, "bob" un kaydedilmesi ("bob" +7 boşluk) olarak kaydedilir. Bir VARCHAR (değişken karakter) sütunu, bir CHAR sütununun yaptığı fazladan alanı boşa harcamadan verileri depolamak içindir.

Her zaman olduğu gibi Wikipedia daha yüksek sesle konuşuyor.


5

CHAR sabit uzunluklu bir alandır; VARCHAR değişken uzunluklu bir alandır. Dizeleri adlar gibi çılgınca değişken uzunlukta saklıyorsanız, bir VARCHAR kullanın, eğer uzunluk her zaman aynı ise, biraz daha boyut etkin ve aynı zamanda biraz daha hızlı olduğu için bir CHAR kullanın.


Buradaki hız ve depolama verimliliği ile ilgili iddiaların doğru olduğunu tahmin etsem de, bunların hiçbiri herhangi bir şekilde doğrulanmamıştır (ve yanlış olmaları mükemmeldir), bu da bu yanıtı kullanışlı değildir; sadece okuyucunun muhtemelen doğru olmasını beklediği şeyleri tekrarlar, bunu doğrulamaya yardımcı olacak hiçbir şey yapmadan tekrarlar.
Mark Amery

1

CHAR sabit uzunluk ve VARCHAR değişken uzunluktur. CHAR, giriş başına her zaman aynı miktarda depolama alanı kullanırken VARCHAR yalnızca gerçek metni depolamak için gereken miktarı kullanır.


1

Karakter sabit uzunluklu bir karakter veri tipidir, varchar değişken uzunluklu karakter veri tipidir.

Char sabit uzunluklu bir veri türü olduğundan, char değerinin depolama boyutu bu sütun için maksimum boyuta eşittir. Varchar değişken uzunlukta bir veri türü olduğundan, varchar değerinin depolama boyutu, bu sütun için maksimum boyut değil, girilen verilerin gerçek uzunluğudur.

Bir sütundaki veri girişlerinin aynı boyutta olması beklendiğinde char kullanabilirsiniz. Bir sütundaki veri girişlerinin boyut olarak önemli ölçüde değişmesi beklendiğinde varchar kullanabilirsiniz.


0

göre Yüksek Performanslı MySQL kitabında:

VARCHAR , değişken uzunluklu karakter dizelerini saklar ve en yaygın dize veri türüdür. Sabit uzunluklu tiplerden daha az depolama alanı gerektirebilir, çünkü yalnızca ihtiyaç duyduğu kadar alan kullanır (yani daha kısa değerleri saklamak için daha az alan kullanılır). İstisna, ROW_FORMAT = FIXED ile oluşturulan ve her satır için diskte sabit bir alan kullanan ve dolayısıyla alan israfına neden olan bir MyISAM tablosudur. VARCHAR , yerden tasarruf sağladığı için performansa yardımcı olur .

CHAR sabit uzunluktadır: MySQL her zaman belirtilen karakter sayısı için yeterli alan ayırır. Bir CHAR değeri saklanırken, MySQL arkadaki boşlukları kaldırır. (Bu, MySQL 4.1 ve daha eski sürümlerindeki VARCHAR için de geçerliydi - CHAR ve VAR CHAR mantıksal olarak aynı ve yalnızca depolama biçiminde farklıydı.) Değerler, karşılaştırmalar için gereken boşluklarla doldurulur.


2
" VARCHAR performansa yardımcı olur çünkü yerden tasarruf sağlar " Yer tasarrufu sağlar, evet, ancak performansı olumsuz etkilemez mi? VARCHARbelleği gerektiği gibi dinamik olarak ayırması gerekir, böylece performansı aksine performansı azaltır CHAR, değil mi?
Spikatrix

@Spikatrix Bağlıdır. VARCHAR değerleri genellikle küçükse ancak N bayta kadar olabilirse, dinamik ayırma önemli miktarda alan ve G / Ç tasarrufu sağlayabilir, bu da çok fazla veri için daha performanslıdır. Kabaca eşit uzunluktaki CHAR değerleri daha yüksek performans gösterir. Okumalar ve yazmalar da muhtemelen bir fark yaratır.
Andrew

-4

Char sabit bir uzunluğa sahiptir (2000 karakteri destekler), karakter bir veri türüdür

Varchar değişken bir uzunluğa sahiptir (4000 karakteri destekler)


1; bu sayılar MySQL için doğru değil. (Sanırım Oracle için olabilirler mi?)
Mark Amery

-5

Karakter veya varchar- uzunluğun parantez içinde gösterilebileceği metin verilerini girmek için kullanılır Örnek karakter (20)


Bu orijinal soruyu ele almaz. OP tiplerin sözdizimi ve amacı değil, tipler arasındaki pratik farklılıkları sormaktadır. Ayrıca (ve )değil dirsekleri, parantez vardır.
2mac

@ 2mac son cümleniz sadece Amerikan İngilizcesi için geçerlidir; İngiltere'de çağırırız (ve )parantez kullanırız ve birçok İngiliz muhtemelen "parantez" kelimesinin noktalama işaretine işaret edebileceği İngiliz lehçeleri olduğunu fark etmez. "Parantez" i "parantez" e tercih etmek için güçlü bir durum var - muhtemelen dengede, programcıların uluslararası bir kitlesini hedeflerken maksimum netlik seçeneği - ama "parantezler" den daha karmaşık bir durum.
Mark Amery

-11

CHAR:

  • Hem Karakter ve Sayıları destekler.
  • 2000 karakteri destekler.
  • Sabit Uzunluk.

VARCHAR:

  • Hem Karakter ve Sayıları destekler.
  • 4000 karakteri destekler.
  • Değişken uzunluk.

herhangi bir yorum......!!!!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.