Apakah ada alasan bagus mengapa saya melihat VARCHAR (255) sering digunakan (tidak seperti panjang yang lain)?

158

Dalam banyak kursus, buku, dan pekerjaan, saya telah melihat bidang teks yang didefinisikan sebagai VARCHAR (255) sebagai jenis default untuk teks "pendek". Apakah ada alasan bagus mengapa panjang 255 dipilih begitu sering, selain menjadi angka bulat yang bagus ? Apakah ini merupakan ketidaksepakatan dari masa lalu ketika ada alasan yang bagus (apakah itu berlaku hari ini atau tidak)?

Saya menyadari, tentu saja, bahwa batas yang lebih ketat akan lebih ideal, jika Anda entah bagaimana mengetahui panjang maksimum string. Tetapi jika Anda menggunakan VARCHAR (255) yang mungkin menunjukkan bahwa Anda tidak tahu panjang maks, hanya bahwa itu adalah string "pendek".


Catatan: Saya menemukan pertanyaan ini ( varchar (255) v tinyblob v tinytext ), yang mengatakan bahwa VARCHAR ( n ) membutuhkan n +1 byte penyimpanan untuk n <= 255, n +2 byte penyimpanan untuk n > 255. Apakah ini satu-satunya alasan? Tampaknya agak arbitrer, karena Anda hanya akan menghemat dua byte dibandingkan dengan VARCHAR (256), dan Anda bisa dengan mudah menyimpan dua byte lainnya dengan mendeklarasikannya VARCHAR (253).

Tidur
sumber

Jawaban:

109

Secara historis, 255 karakter sering menjadi panjang maksimum VARCHARdalam beberapa DBMS, dan kadang-kadang masih menjadi maksimum yang efektif jika Anda ingin menggunakan UTF-8 dan memiliki kolom yang diindeks (karena batasan panjang indeks).

kekacauan
sumber
4
@CharlesBretana: jika Anda membaca sisa kalimat yang Anda kutip, Anda akan menemukan penjelasan persis yang Anda minta.
kekacauan
2
@CharlesBretana: Dengan "palsu UTF-8" Maksud saya MySQL "utf8" encoding, yang seperti yang saya sebutkan cadangan (dan terbatas pada) 3 byte per karakter. Ini bukan versi yang sangat baik dari UTF-8; jika Anda ingin UTF-8 yang layak di MySQL, Anda harus menggunakan penyandian "utf8mb4". Tetapi orang-orang jauh lebih mungkin untuk tidak mengetahuinya dan pergi dengan "utf8", dan jauh lebih mungkin menginginkan UTF-8 daripada pengkodean lainnya, jadi, presto, mereka berakhir dengan panjang maksimum 255 karakter yang dapat diindeks dalam VARCHAR. Meskipun demikian, keherananmu.
kekacauan
3
@CharlesBretana: Saya sekarang sudah menjelaskannya tiga kali dan tidak ada satupun yang berubah. Batas panjang indeks MySQL masih 767 byte, jumlah byte yang diperlukan untuk mengkodekan karakter UTF-8 3 byte masih 3, dan lantai (767/3) masih 255. Tekad Anda untuk menemukan sesuatu yang membingungkan tentang kepercayaan pengemis .
kekacauan
1
@CharlesBretana (Maaf karena terlambat ke pesta ini) Saya bukan spesialis DB, tapi saya pikir apa yang dikatakan kekacauan adalah: ya kolom 'Palsu UTF-8' bisa lebih dari 255 karakter, tetapi indeks akan hanya bekerja pada 255 karakter pertama dari varchar, membuatnya secara efektif maksimum kolom jika Anda ingin sepenuhnya diindeks. Sekarang hanya itu yang saya mengerti dari penjelasannya, saya mungkin salah, saya bukan ahli dalam indeks SQL sama sekali.
Francis Lord
2
@CharlesBretana Jika Anda melihat jawaban Chaos dengan benar, Anda akan melihatnya dipisahkan menjadi 2 bagian: 1. Alasan historis di balik Varchar (255) begitu umum (dulu maksimum pada beberapa DBMS lama), 2. Bahkan saat ini, masih ada batasan untuk beberapa karena keterbatasan indeks yang dibahas sebelumnya, Bagian 1 dan 2 tidak terkait. Bagian 1 adalah jawaban aktual untuk pertanyaan, bagian 2 adalah catatan tambahan yang masih relevan dengan pertanyaan karena menjelaskan mengapa bahkan hari ini mungkin masih menjadi batasan. (LANJUTAN ->)
Francis Lord
161

255 digunakan karena jumlah karakter terbesar yang dapat dihitung dengan angka 8-bit. Ini memaksimalkan penggunaan hitungan 8-bit, tanpa perlu banyak byte lain untuk menghitung karakter di atas 255.

Ketika digunakan dengan cara ini, VarChar hanya menggunakan jumlah byte + 1 untuk menyimpan teks Anda, jadi sebaiknya Anda mengaturnya menjadi 255, kecuali jika Anda menginginkan batas keras (seperti 50) pada jumlah karakter di lapangan.

Robert Harvey
sumber
90
Saya suka frasa itu: "dengan sembrono membutuhkan satu byte penuh". =)
MusiGenesis
7
Apakah ini berlaku untuk DB di mana varchars adalah UTF-8?
antak
1
@ antak: Di MySQL, menggunakan InnoDB, kolom kunci apa pun tidak boleh lebih besar dari 767 byte. Jika kolom VARCHAR adalah UTF8 (artinya masing-masing karakter dapat memakan waktu hingga 3 byte), panjang kolom maksimum yang diijinkan adalah lantai (767/3) = 255. Saya mengasumsikan "767" dipilih karena alasan itu.
BlueRaja - Danny Pflughoeft
1
Jika charset adalahutf8 , varchar(85)batas atas yang melintasi tips panjang byte dari satu hingga dua byte. Jika itu utf8mb4, itu varchar(63). Ini penting karena merupakan maksimum yang panjang VARCHAR dapat diperpanjang melalui penggunaan ALTER TABLE online . Akibatnya, saya memperoleh angka-angka itu dengan membuat tabel dengan varchar(2) charset utf8kolom dan melihat sejauh mana saya bisa memperpanjangnya ALGORITHM=INPLACE.
antak
Lebih masuk akal ketika Anda mempertimbangkan bahwa banyak "database" Back In The Day disimpan dalam pita magnetik. Sangat umum untuk membaca data dalam "blok" yang berukuran dalam kelipatan dua. Dengan cara ini, data disimpan paling efisien (dan ketika Anda menjalankan pada mainframe lama, efisiensi kecil seperti itu adalah optimasi make-it-or-break-it).
TMN
23

Mungkin karena baik SQL Server dan Sybase (untuk nama dua saya kenal) digunakan untuk memiliki maksimum 255 karakter dalam jumlah karakter dalam VARCHARkolom. Untuk SQL Server, ini berubah dalam versi 7 pada tahun 1996/1997 atau lebih ... tetapi kebiasaan lama terkadang sulit.

Charles Bretana
sumber
8
+1 untuk mengutip DB dan Versi tertentu. Dan "Kebiasaan lama sangat sulit" mungkin merupakan jawaban yang paling benar.
Andrew M
17

Saya akan menjawab pertanyaan literal: tidak , tidak ada alasan bagus yang Anda lihat VARCHAR (255) sering digunakan (memang ada alasan , seperti yang dibahas dalam jawaban lain, hanya saja bukan yang bagus). Anda tidak akan menemukan banyak contoh proyek yang gagal serempak karena arsitek memilih VARCHAR (300) daripada VARCHAR (255). Ini akan menjadi masalah hampir tidak signifikan bahkan jika Anda berbicara tentang CHAR, bukan VARCHAR.

MusiGenesis
sumber
1 byte dari 255 adalah 0,4%. Terkadang Anda peduli dengan setengah persen terakhir atau lebih. Terkadang tidak. Jika biaya hosting dan perf Anda mencapai puluhan dolar, Anda mungkin tidak peduli. Jika mereka berjuta-juta, mereka mungkin melakukannya.
Edward Brey
2
@ EdwardBrey: jika Hukum Moore masih berlaku, jawaban saya di sini 16 kali lebih valid daripada ketika saya menulisnya.
MusiGenesis
Kecuali kami telah menemukan 16 kali lebih banyak cara komputer dapat membantu kami. Kecepatan masih menjadi fitur.
Edward Brey
14

Ketika Anda mengatakan 2^8Anda mendapatkannya 256, tetapi angka dalam istilah komputer dimulai dari angka tersebut 0. Jadi, setelah Anda mendapatkannya 255, Anda bisa menyelidikinya di internet mask untuk IP atau IP itu sendiri.

255 adalah nilai maksimum integer 8 bit: 11111111 = 255

Apakah itu membantu?

eksekutif-
sumber
1
Dengan bilangan bulat, Anda menghitung mulai dari 0 dan Anda berakhir pada 255. Tetapi dengan tempat dalam string, Anda menghitung mulai dari tempat 1, jadi tidak masuk akal untuk berakhir di tempat 256, karena Anda mulai dari 1 alih-alih 0? Saya tidak setuju dengan varchar (256) sepenuhnya dulu, karena hasil string_length (), tapi saya benar-benar tidak yakin.
HoldOffHunger
1
@HoldOffHunger string dalam database dapat memiliki panjang nol karakter, sehingga rentang panjang yang diizinkan ketika panjang disimpan dalam delapan bit adalah antara 0 dan 255. Jika Anda ingin mengatakan bahwa string semua harus memiliki setidaknya satu karakter maka Anda dapat mendukung string 256-karakter dengan panjang delapan-bit.
phoog
7

Catatan: Saya menemukan pertanyaan ini ( varchar (255) v tinyblob v tinytext ), yang mengatakan bahwa VARCHAR ( n ) membutuhkan n +1 byte penyimpanan untuk n <= 255, n +2 byte penyimpanan untuk n > 255. Apakah ini satu-satunya alasan? Tampaknya agak arbitrer, karena Anda hanya akan menghemat dua byte dibandingkan dengan VARCHAR (256), dan Anda bisa dengan mudah menyimpan dua byte lainnya dengan mendeklarasikannya VARCHAR (253).

Tidak, Anda tidak menyimpan dua byte dengan mendeklarasikan 253. Implementasi varchar kemungkinan besar adalah penghitung panjang dan panjang variabel, array yang tidak ditentukan. Ini berarti bahwa jika Anda menyimpan "halo" dalam varchar (255) Anda akan menempati 6 byte: satu byte untuk panjang (angka 5) dan 5 byte untuk lima huruf.

Stefano Borini
sumber
3
Pernyataan ini tidak berlaku untuk semua basis data. banyak basis data menggunakan bidang varchar dari ukuran yang diberikan dalam tabel sehingga mereka tidak harus memindahkan baris ketika bidang itu diubah untuk satu baris.
SingleNegationElimination
ya kamu benar. tergantung implementasi. Anda harus memeriksa manual vendor untuk melihat apa yang terjadi
Stefano Borini
2
Mungkin diizinkan, tetapi menerapkan VARCHARcara itu mengalahkan seluruh titik penggunaan VARCHARalih-alih CHAR.
dan04
4

Nomor 1 byte yang tidak ditandatangani dapat berisi kisaran [0-255] inklusif. Jadi, ketika Anda melihat 255, itu sebagian besar karena programmer berpikir dalam basis 10(dapatkan lelucon?) :)

Sebenarnya, untuk sementara, 255 adalah ukuran terbesar yang bisa Anda berikan VARCHAR di MySQL, dan ada keuntungan menggunakan VARCHAR dibandingkan TEXT dengan pengindeksan dan masalah lainnya.

gahooa
sumber
4

Dalam banyak aplikasi, seperti MsOffice (hingga versi 2000 atau 2002), jumlah maksimum karakter per sel adalah 255. Memindahkan data dari program yang mampu menangani lebih dari 255 karakter per bidang ke / dari aplikasi tersebut adalah mimpi buruk. Saat ini, batasnya kurang dan kurang menghalangi.

Joaquin Montes
sumber
2

0000 0000 -> ini adalah angka biner 8-bit. Digit mewakili sedikit.

Anda menghitung seperti itu:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

Setiap bit bisa menjadi salah satu dari dua nilai: hidup atau mati. Total angka tertinggi dapat diwakili oleh perkalian:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

Atau

2^8 - 1. 

Kami kurangi satu karena angka pertama adalah 0.

255 dapat menampung cukup banyak (tidak ada permainan kata-kata) nilai.

Saat kami menggunakan lebih banyak bit, nilai maks naik secara eksponensial. Oleh karena itu untuk banyak tujuan, menambahkan lebih banyak bit terlalu banyak.

ScottyBlades
sumber
1

Alasan lain mungkin bahwa di pustaka akses data yang sangat lama pada Windows seperti RDO dan ADO (versi COM bukan ADO.NET) Anda harus memanggil metode khusus, GetChunk, untuk mendapatkan data dari kolom dengan lebih dari 255 karakter. Jika Anda membatasi kolom varchar ke 255, kode tambahan ini tidak diperlukan.

Booji Boy
sumber