Depolamada, her zaman 255 karakter depolayacağından VARCHAR(255)farklı olarak, yalnızca ihtiyacınız olan uzunluğu belirli bir satırda depolayacak kadar akıllıdır CHAR(255).
Ancak bu soruyu MySQL ile etiketlediğiniz için, MySQL'e özgü bir ipucundan bahsedeceğim: satırlar depolama motoru katmanından SQL katmanına kopyalandıkça, VARCHARalanlar CHARsabit genişlikteki satırlarla çalışmanın avantajını elde etmek için dönüştürülür . Böylece bellekteki dizeler , bildirilen sütununuzun maksimum uzunluğuna kadar doldurulurVARCHAR .
Sorgunuz örtük olarak geçici bir tablo oluşturduğunda, örneğin sıralama sırasında veya GROUP BYbu çok fazla bellek kullanabilir. VARCHAR(255)O kadar uzun olması gerekmeyen veriler için çok fazla alan kullanırsanız , bu geçici tabloyu çok büyük hale getirebilir.
Ayrıca, bu "doldurma" davranışının, utf8 karakter kümesiyle bildirilen bir dizenin, tek baytlık içerikle (örneğin, ascii veya latin1 karakterleri) sakladığınız dizeler için bile karakter başına üç bayta kadar ödeme yapacağı anlamına geldiğini bilmek isteyebilirsiniz. Ve benzer şekilde utf8mb4 karakter kümesi, dizenin bellekteki karakter başına dört bayta kadar doldurmasına neden olur.
Dolayısıyla, VARCHAR(255)"Fikrim yok" gibi kısa bir dizeyi depolayan bir utf8 içinde diskte 11 bayt alır (on alt karakter grubu artı uzunluk için bir bayt) ancak bellekte ve dolayısıyla geçici tablolarda veya sıralı sonuçlarda 765 bayt alır.
Farkında olmadan sık sık 1,5 GB geçici tablolar oluşturan ve disk alanlarını dolduran MySQL kullanıcılarına yardımcı oldum. VARCHAR(255)Pratikte çok kısa dizeler depolayan çok sayıda sütunları vardı .
En iyisi, depolamayı düşündüğünüz veri türüne göre sütunu tanımlamaktır. Diğer insanların da bahsettiği gibi, uygulama ile ilgili kısıtlamaları zorlama faydaları vardır. Ancak yukarıda anlattığım hafıza israfını önlemek için fiziksel faydaları var.
Elbette en uzun posta adresinin ne olduğunu bilmek zordur, bu yüzden birçok insan VARCHARkesinlikle herhangi bir adresten daha uzun bir uzun posta adresi seçer . 255 ise gelenekseldir çünkü VARCHARuzunluğu bir bayt ile kodlanabilen maksimum a uzunluğudur. Ayrıca VARCHARMySQL'de 5.0'dan daha eski olan maksimum uzunluktu.