Anda sering melihat bidang-bidang basis data yang ditetapkan memiliki ukuran 255 karakter, apa alasan tradisional / historis mengapa? Saya menganggap itu ada hubungannya dengan batas paging / memori, dan kinerja tetapi perbedaan antara 255 dan 256 selalu membingungkan saya.
varchar(255)
Mengingat ini adalah kapasitas atau besarnya, bukan pengindeks , mengapa 255 lebih disukai daripada 256? Apakah byte disediakan untuk tujuan tertentu (terminator atau null atau sesuatu)?
Agaknya varchar (0) adalah omong kosong (memiliki kapasitas nol)? Kalau begitu, 2 ^ 8 ruang seharusnya 256?
Apakah ada besaran lain yang memberikan manfaat kinerja? Sebagai contoh adalah varchar (512) kurang berkinerja daripada varchar (511) atau varchar (510)?
Apakah nilai ini sama untuk semua database relasi, lama dan baru?
disclaimer - Saya bukan pengembang DBA, saya menggunakan ukuran dan tipe bidang yang sesuai dengan logika bisnis saya di mana itu diketahui, tapi saya ingin tahu alasan historis untuk preferensi ini, bahkan jika itu tidak lagi relevan (tetapi bahkan lebih banyak jika masih relevan).
Edit:
Terima kasih atas jawabannya, tampaknya ada beberapa konsensus bahwa byte digunakan untuk menyimpan ukuran, tetapi ini tidak menyelesaikan masalah secara definitif dalam pikiran saya.
Jika meta data (panjang string) disimpan dalam memori / disk yang berdekatan, masuk akal. 1 byte metadata dan 255 byte data string, akan cocok satu sama lain dengan sangat baik, dan sesuai dengan 256 byte penyimpanan yang berdekatan, yang mungkin rapi dan rapi.
Tapi ... Jika metadata (panjang string) disimpan secara terpisah dari data string aktual (mungkin dalam tabel master), maka untuk membatasi panjang data string dengan satu byte, hanya karena lebih mudah untuk menyimpan hanya integer 1 byte metadata tampaknya agak aneh.
Dalam kedua kasus tersebut, kelihatannya ada kehalusan yang mungkin tergantung pada implementasi DB. Praktek menggunakan 255 tampaknya cukup luas, jadi seseorang di suatu tempat pasti berpendapat kasus yang baik untuk itu pada awalnya, adakah yang bisa mengingat apa kasus itu? Programmer tidak akan mengadopsi praktik baru apa pun tanpa alasan, dan ini pasti baru sekali.
sumber
Jawaban:
Dengan panjang maksimum 255 karakter, DBMS dapat memilih untuk menggunakan satu byte untuk menunjukkan panjang data di lapangan. Jika batasnya 256 atau lebih besar, diperlukan dua byte.
Nilai panjang nol tentu berlaku untuk
varchar
data (kecuali dibatasi sebaliknya). Sebagian besar sistem memperlakukan string kosong seperti berbeda dari NULL, tetapi beberapa sistem (terutama Oracle) memperlakukan string kosong secara identik dengan NULL. Untuk sistem di mana string kosong bukan NULL, bit tambahan di suatu tempat di baris akan diperlukan untuk menunjukkan apakah nilai tersebut harus dianggap NULL atau tidak.Seperti yang Anda perhatikan, ini adalah optimasi historis dan mungkin tidak relevan untuk sebagian besar sistem saat ini.
sumber
varchar(0)
. Ini mungkin tidak berguna karena nilainya hanya bisa dua hal, string kosong atau NULL, dan Anda mungkin juga hanya menggunakan abit
untuk itu.255 adalah batas varchar di mySQL4 dan sebelumnya.
Juga 255 karakter + terminator kosong = 256
Atau deskriptor panjang 1 byte memberikan kisaran 0-255 karakter
sumber
char foo[256]
penting karena manajemen memori menyukai 2. kekuatan. Lihat: stackoverflow.com/questions/3190146/… Mengalokasikanchar foo[257]
akan memecah memori atau mengambil 512 byte.255 adalah nilai numerik terbesar yang dapat disimpan dalam bilangan bulat tak bertanda satu byte (dengan asumsi byte 8-bit) - karenanya, aplikasi yang menyimpan panjang string untuk tujuan tertentu akan lebih suka 255 lebih dari 256 karena itu berarti mereka hanya perlu mengalokasikan 1 byte untuk variabel "size".
sumber
Dari Manual MySQL:
Memahami dan membuat pilihan.
sumber
M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value.
dev.mysql.com/doc/refman/5.7/en/storage-requirements.html255 adalah nilai maksimum integer 8 bit: 11111111 = 255.
sumber
Panjang maksimum 255 memungkinkan mesin database menggunakan hanya 1 byte untuk menyimpan panjang masing-masing bidang. Anda benar bahwa 1 byte ruang memungkinkan Anda untuk menyimpan 2 ^ 8 = 256 nilai yang berbeda untuk panjang string.
Tetapi jika Anda mengizinkan bidang untuk menyimpan string teks panjang nol, Anda harus dapat menyimpan panjangnya nol. Jadi, Anda dapat mengizinkan 256 nilai panjang berbeda, mulai dari nol: 0-255.
sumber
Seringkali varchars diimplementasikan sebagai string pascal: memegang panjang aktual dalam byte # 0. Karena itu panjangnya terikat ke 255. (Nilai byte bervariasi dari 0 hingga 255.)
sumber
<<
Mengingat dasar-dasar penyimpanan bit / byte, ini membutuhkan satu byte untuk menyimpan integer di bawah 256 dan dua byte untuk integer antara 256 dan 65536. Oleh karena itu, diperlukan ruang yang sama (dua byte) untuk menyimpan 511 atau 512 atau untuk itu 65535 .... Dengan demikian jelas bahwa argumen yang disebutkan dalam diskusi di atas adalah N / A untuk varchar (512) atau varchar (511).
sumber
8 bit yang tidak ditandatangani = 256 byte
255 karakter + byte 0 panjangnya
sumber
Dulu semua string membutuhkan terminator NUL, atau "backslash-zero". Database yang diperbarui tidak memilikinya. Itu "255 karakter teks" dengan "\ 0" ditambahkan secara otomatis di akhir sehingga sistem tahu di mana string berakhir. Jika Anda mengatakan VARCHAR (256), hasilnya akan menjadi 257 dan Anda akan berada di register berikutnya untuk satu karakter. Boros Itu sebabnya semuanya adalah VARCHAR (255) dan VARCHAR (31). Karena kebiasaan, 255 tampaknya telah bertahan tetapi 31-an menjadi 32-an dan 511-an menjadi 512-an. Bagian itu aneh. Sulit untuk membuat saya menulis VARCHAR (256).
sumber
Saya pikir ini mungkin menjawab pertanyaan Anda. Sepertinya itu adalah batas maksimal varchar di sistem sebelumnya. Saya mengambilnya dari pertanyaan stackoverflow lainnya.
Apakah ada kerugian menggunakan varchar generik (255) untuk semua bidang berbasis teks?
sumber
Data disimpan dalam memori dalam sistem biner dan 0 dan 1 adalah digit biner. Nomor biner terbesar yang dapat ditampung dalam 1 byte (8-bit) adalah 11111111 yang dikonversi menjadi desimal 255.
sumber