Mengapa secara historis orang menggunakan 255 bukan 256 untuk besaran bidang basis data?

190

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.

Andrew M
sumber
3
Karena jumlah karakter dimulai dari 0 hingga N-1. Jadi 256 karakter akan dinyatakan sebagai varchar (255). Kecuali saya salah.
Buhake Sindi
3
Mungkin karena orang-orang IT mulai menghitung dengan 0, bukan 1;)?
Romain Linsolas
Saya pikir itu ada hubungannya dengan programmer sekolah tua, bahkan tidak ingat mengapa kita melakukannya.
Grumpy
7
@Elite Gentleman: nggak nomor dalam kurung adalah panjang sebenarnya ... Seperti dalam deklarasi array C: x [256] memberikan x [0] ... x [255].
RedPandaCurios
@romaintaz - tetapi pertimbangkan array yang dapat menyimpan 1 item. Anda menyatakannya sesuatu [1] dan mengaksesnya sesuatu [0]. Pertanyaannya adalah mengapa dalam SQL kita menyatakan kapasitas menjadi 1 byte kurang dari yang tampak logis pada pandangan pertama.
Andrew M

Jawaban:

167

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 varchardata (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.

Greg Hewgill
sumber
Memesan byte untuk panjang itu masuk akal, tetapi WRT paragraf kedua Anda, mungkin a / value / of length nol adalah valid, tetapi apakah a / kapasitas / of length nol valid?
Andrew M
1
@Andrew: Saya baru saja mencoba dan PostgreSQL menolak varchar(0). Ini mungkin tidak berguna karena nilainya hanya bisa dua hal, string kosong atau NULL, dan Anda mungkin juga hanya menggunakan a bituntuk itu.
Greg Hewgill
Jadi benarkah untuk mengasumsikan bahwa metadata kapasitas disimpan dalam blok bersebelahan yang sama dengan data itu sendiri, dan oleh karena itu ada keuntungan bagi DB untuk menjaga total dua hal (data dan metadata) dalam satu halaman (mungkin 256 byte)?
Andrew M
@Andrew: Itu asumsi yang mungkin atau mungkin tidak benar, tergantung pada detail implementasi dari DBMS yang dimaksud. Ukuran halaman biasanya jauh lebih besar dari 256 byte. Seperti yang saya sebutkan, optimasi semacam ini kadang-kadang penting (mis. Jika Anda menyimpan miliaran baris kecil), tetapi sebagian besar waktu itu tidak perlu dikhawatirkan.
Greg Hewgill
3
Pentingnya ruang disk (dan ruang indeks) bukan karena 256 mungkin muat dalam satu halaman tetapi karena 1 byte vs 2 byte (untuk baris jutaan / miliaran / triliunan) membuat perbedaan besar.
ypercubeᵀᴹ
35

255 adalah batas varchar di mySQL4 dan sebelumnya.

Juga 255 karakter + terminator kosong = 256

Atau deskriptor panjang 1 byte memberikan kisaran 0-255 karakter

RedPandaCurios
sumber
Dan membaca menjadi char foo[256]penting karena manajemen memori menyukai 2. kekuatan. Lihat: stackoverflow.com/questions/3190146/… Mengalokasikan char foo[257]akan memecah memori atau mengambil 512 byte.
ebyrob
4
Bukankah varchar menyimpan panjang string, dan karena itu tidak memerlukan terminator nol?
Cruncher
19

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".

Amber
sumber
17

Dari Manual MySQL:

Tipe Data:
VARCHAR (M), VARBINARY (M)

Diperlukan Penyimpanan:
L + 1 byte jika nilai kolom memerlukan 0 - 255 byte, L + 2 byte jika nilai mungkin memerlukan lebih dari 255 byte

Memahami dan membuat pilihan.

Anil Shinde
sumber
Ya, tapi 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.html
DLight
13

255 adalah nilai maksimum integer 8 bit: 11111111 = 255.

remi bourgarel
sumber
7

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.

MarkJ
sumber
6

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.)

Vlad
sumber
5

<<

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).

Balaji Katika
sumber
4

8 bit yang tidak ditandatangani = 256 byte

255 karakter + byte 0 panjangnya

gbn
sumber
3

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).

Greg
sumber
0

Saya pikir ini mungkin menjawab pertanyaan Anda. Sepertinya itu adalah batas maksimal varchar di sistem sebelumnya. Saya mengambilnya dari pertanyaan stackoverflow lainnya.

Sulit untuk mengetahui apa alamat pos terpanjang itu, tentu saja, itulah sebabnya banyak orang memilih VARCHAR panjang yang tentu lebih panjang daripada alamat mana pun. Dan 255 adalah kebiasaan karena itu mungkin merupakan panjang maksimum VARCHAR di beberapa basis data pada waktu awal (dan juga PostgreSQL hingga saat ini).

Apakah ada kerugian menggunakan varchar generik (255) untuk semua bidang berbasis teks?

Neo M Hacker
sumber
0

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.

Ejaz
sumber