mysql'de bir VARCHAR
sütunu ile bir tablo oluşturduğumuzda, bunun için uzunluğu ayarlamamız gerekir. Ancak TEXT
türü için uzunluğu belirtmemiz gerekmez.
VARCHARve
TEXT` arasındaki farklar nelerdir?
TEXT
c
bayt disk alanı alır; burada c
depolanan dizenin uzunluğudur.VARCHAR(M)
M
karakter boyutuc
bayt (M
≤ 255 için) veya 2 + c
(256 ≤ M
≤ 65535 için) bayt disk alanı alır; burada c
depolanan dizenin uzunluğudurTEXTin maksimum boyutu **sabit** olarak
2¹⁶-1 = 65535karakterdir. VARCHAR
, M = 2¹⁶-1
değerine kadar bir değişken maksimum M
boyutuna sahiptir.
Yani TEXT
boyutunu seçemezsiniz, ancak bir VARCHAR
için seçebilirsiniz.
Diğer bir fark ise, bir TEXT
sütununa bir dizin (tam metin dizini hariç) koyamazsınız.
Dolayısıyla, sütun üzerinde bir indekse sahip olmak istiyorsanız, VARCHAR
kullanmanız gerekir. Ancak, bir dizinin uzunluğunun da sınırlı olduğuna dikkat edin, bu nedenle VARCHAR
sütununuz çok uzunsa, dizininizde VARCHAR
sütununun yalnızca ilk birkaç karakterini kullanmanız gerekir (CREATE INDEX
için belgelere bakın).
Ancak, olası girdi dizesinin maksimum uzunluğunun yalnızca M
olduğunu biliyorsanız, örneğin bir telefon numarası veya bir ad veya bunun gibi bir şey gibi, VARCHAR
kullanmak da istersiniz. O zaman TINYTEXT
veya TEXT
yerine VARCHAR(30)
kullanabilirsiniz ve birisi üç "Lord of the Ring" kitabının metnini telefon numarası sütununuza kaydetmeye çalışırsa, yalnızca ilk 30 karakteri depolarsınız :)
**Veritabanında saklamak istediğiniz metin 65535 karakterden uzunsa, MEDIUMTEXT
veya LONGTEXT
seçmelisiniz, ancak dikkatli olun: MEDIUMTEXT16 MB
a kadar, LONGTEXT
4 GBa kadar dizeleri depolar. Eğer
LONGTEXTkullanırsanız ve veriyi PHP ile alırsanız (en azından
store_resultolmadan
mysqli` kullanırsanız), bellek ayırma hatası alabilirsiniz, çünkü PHP tüm dizginin tamponlanabileceğinden emin olmak için 4 GB bellek ayırmaya çalışır. Bu belki PHP'den başka dillerde de olabilir.
Ancak, girdiyi veritabanında depolamadan önce her zaman kontrol etmelisiniz (Çok uzun mu? Garip kodlar içeriyor mu?).
Dikkat edin: Her iki tür için de gerekli disk alanı maksimum uzunluğa değil, yalnızca depolanan dizenin uzunluğuna bağlıdır.
*Örneğin, latin1 karakter kümesini kullanırsanız ve "Test" metnini VARCHAR(30)
, VARCHAR(100)
ve TINYTEXT
içinde saklarsanız, her zaman 5 bayt gerekir (dizenin uzunluğunu saklamak için 1 bayt ve her karakter için 1 bayt). Aynı metni bir VARCHAR(2000)
veya TEXT
sütununda depolarsanız, yine aynı alanı gerektirir, ancak bu durumda 6 bayt olacaktır (dize uzunluğunu depolamak için 2 bayt ve her karakter için 1 bayt).
Daha fazla bilgi için belgelere göz atın.
Son olarak, hem TEXT
hem de VARCHAR
değişken uzunluklu veri tipleridir ve bu nedenle verileri depolamak için ihtiyaç duyduğunuz alanı büyük olasılıkla en aza indirirler. Ancak bu, performans için bir değiş tokuş ile birlikte gelir. Daha iyi performansa ihtiyacınız varsa, CHAR
gibi sabit uzunlukta bir tür kullanmanız gerekir. Bu konuda daha fazla bilgi edinebilirsiniz burada.