dibagi terkait dengan beberapa info yang menjelaskan masalah dasar (ada perbedaan kinerja), tetapi tidak cukup sederhana untuk mengatakan bahwa seseorang selalu lebih baik daripada yang lain. (Jika tidak, tidak akan ada alasan untuk memiliki keduanya.) Juga, di MyISM, ukuran maksimal 64k untuk VARCHAR bukan per bidang - per rekaman.
Pada dasarnya, ada 4 cara untuk menyimpan string dalam catatan basis data:
- panjang tetap
- String gaya-C (ditandai dengan karakter NULL atau serupa di akhir string)
- String gaya pascal (beberapa byte untuk menunjukkan panjang, kemudian string)
- Pointer (simpan string di tempat lain)
MyISM menggunakan sesuatu yang mirip dengan # 3 untuk VARCHAR, dan pendekatan hybrid untuk TEXT di mana ia menyimpan awal string dalam catatan, lalu sisa string di tempat lain. InnoDB serupa untuk VARCHAR, tetapi menyimpan bidang TEKS lengkap di luar catatan.
Dengan 1 & 4, hal-hal dalam catatan selalu sama panjangnya, jadi lebih mudah untuk dilewati jika Anda tidak membutuhkan string, tetapi perlu hal-hal setelahnya. Baik # 2 dan # 3 tidak terlalu buruk untuk string pendek ... # 2 harus terus mencari penanda, sementara # 3 dapat melompat ke depan ... karena string semakin panjang, # 2 semakin buruk untuk penggunaan khusus ini kasus.
Jika Anda benar-benar perlu membaca string, # 4 lebih lambat, karena Anda harus membaca catatan, kemudian membaca string yang mungkin disimpan di tempat lain di disk, tergantung pada bagaimana database itu menanganinya. # 1 selalu sangat mudah, dan sekali lagi Anda mengalami masalah serupa di mana untuk # 2 semakin buruk semakin lama string, sedangkan # 3 sedikit lebih buruk daripada # 2 untuk string yang sangat kecil, tetapi lebih baik karena semakin lama.
Lalu ada persyaratan penyimpanan ... # 1 selalu merupakan panjang yang tetap, jadi mungkin akan menggembung jika sebagian besar string bukan panjang maksimal. # 2 memiliki 1 byte ekstra; # 3 biasanya memiliki 2 byte tambahan jika panjang maks = 255, 4 byte tambahan jika 64k maks. # 4 memiliki panjang pointer, ditambah aturan untuk # 3 biasanya.
Untuk implementasi spesifik dalam MySQL 5.1, dokumen untuk status MyISM :
- Dukungan untuk tipe VARCHAR sejati; kolom VARCHAR dimulai dengan panjang yang disimpan dalam satu atau dua byte.
- Tabel dengan kolom VARCHAR mungkin memiliki panjang baris tetap atau dinamis.
- Jumlah dari panjang kolom VARCHAR dan CHAR dalam sebuah tabel bisa mencapai 64KB.
Sedangkan untuk InnoDB :
- Bagian panjang variabel dari header catatan berisi vektor bit untuk menunjukkan kolom NULL. Jika jumlah kolom dalam indeks yang bisa NULL adalah N, vektor bit menempati CEILING (N / 8) byte. (Misalnya, jika ada 9 hingga 15 kolom yang bisa NULL, vektor bit menggunakan dua byte.) Kolom yang NULL tidak menempati ruang selain bit dalam vektor ini. Bagian panjang variabel dari header juga berisi panjang kolom panjang variabel. Setiap panjang membutuhkan satu atau dua byte, tergantung pada panjang maksimum kolom. Jika semua kolom dalam indeks BUKAN NULL dan memiliki panjang tetap, header catatan tidak memiliki bagian panjang variabel.
- Untuk setiap bidang panjang variabel non-NULL, header catatan berisi panjang kolom dalam satu atau dua byte. Dua byte hanya akan diperlukan jika bagian dari kolom disimpan secara eksternal di halaman meluap atau panjang maksimum melebihi 255 byte dan panjang sebenarnya melebihi 127 byte. Untuk kolom yang disimpan secara eksternal, panjang dua byte menunjukkan panjang bagian yang disimpan secara internal ditambah penunjuk 20-byte ke bagian yang disimpan secara eksternal. Bagian internal 768 byte, jadi panjangnya 768 + 20. Pointer 20 byte menyimpan panjang kolom yang sebenarnya.
...
seperti halnya banyak hal lain ketika berurusan dengan basis data, jika Anda tidak yakin apa yang terbaik untuk kebutuhan Anda, cobalah membandingkannya dengan data & penggunaan yang serupa, dan lihat bagaimana perilakunya.