Jenis bidang basis data terbaik untuk URL

352

Saya perlu menyimpan url di tabel MySQL. Apa praktik terbaik untuk mendefinisikan bidang yang akan menampung URL dengan panjang yang tidak ditentukan?

Jesse Hattabaugh
sumber
1
Tergantung pada apa yang Anda butuhkan, pengindeksan, kesatuan?
Thomas Decaux
2
Saya mengharapkan jawaban yang cukup mudah di sini tetapi cukup terkejut dengan jawaban yang mencakup hal-hal yang tidak saya pertimbangkan. Bacaan yang sangat menarik yang saya tambahkan ke akun pendidikan saya.
HPWD
1
Ikuti saja TEXTtipenya dan lewati membaca semua jawaban di bawah ini. Pada akhirnya, itulah yang kebanyakan dari mereka sarankan. :) Tentu saja, jika Anda memerlukan pengindeksan atau keunikan, gunakan VARCHAR, karena TEXTtidak dapat diindeks dengan mudah .
Aleksandar

Jawaban:

324
  1. Panjang URL maks penyebut umum terendah di antara browser web populer: 2,083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    Nilai dalam kolom VARCHAR adalah string dengan panjang variabel. Panjangnya dapat ditentukan sebagai nilai dari 0 hingga 255 sebelum MySQL 5.0.3, dan 0 hingga 65.535 dalam versi 5.0.3 dan yang lebih baru. Panjang maksimum efektif dari VARCHAR di MySQL 5.0.3 dan yang lebih baru tergantung pada ukuran baris maksimum (65.535 byte, yang dibagi di antara semua kolom) dan rangkaian karakter yang digunakan.

  3. Jadi ...
    <MySQL 5.0.3 gunakan TEXT
    atau
    > = MySQL 5.0.3 gunakan VARCHAR (2083)

micahwittman
sumber
14
Jawaban yang bagus, tetapi secara pribadi saya akan membatasi panjangnya. Bergantung pada proyeknya, Anda mungkin ingin membatasi url yang diterima. Siapa yang menggunakan url longet dari 200?
John
2
Mereka lebih baik datang dengan tipe data uri yang "memahami" struktur uri sehingga pengindeksan dan pencarian dilakukan secara efisien, seperti oracle lakukan ... tunggu, mysql sekarang oracle ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben
80
Jawaban ini sedikit menyesatkan. Perhatikan bahwa "Penyebut umum terendah" di sini tidak ada artinya, Anda ingin menggunakan angka tertinggi yang diterima browser atau server (yang tidak konsisten dan dapat berubah). Seperti kata tautan Anda: " ... spesifikasi protokol HTTP tidak menentukan panjang maksimal ... ", jadi jangan repot-repot dengan itu VARCHAR(2083), cukup gunakan TEXT.
Wesley Murch
4
Contoh, juga dari tautan Anda: " Setelah 65.536 karakter, bilah lokasi tidak lagi menampilkan URL di Windows Firefox 1.5.x. Namun, URL yang lebih lama akan berfungsi. Saya berhenti menguji setelah 100.000 karakter. "
Wesley Murch
1
Sumber daya boutell.com jatuh dari jaring. Berikut rujukannya dalam buku O'Reilly yang dipindai: books.google.ca/…
micahwittman
33

VARCHAR(512)(atau serupa) harus memadai. Namun, karena Anda tidak benar-benar tahu panjang maksimum URL yang dipermasalahkan, saya mungkin langsung menuju TEXT. Bahaya dengan ini tentu saja kehilangan efisiensi karena CLOBjauh lebih lambat daripada tipe data string sederhana VARCHAR.

Daniel Spiewak
sumber
bagaimana dengan pemeriksaan?
kommradHomer
16

varchar(max) untuk SQLServer2005

varchar(65535) untuk MySQL 5.0.3 dan yang lebih baru

Ini akan mengalokasikan penyimpanan sesuai kebutuhan dan tidak boleh memengaruhi kinerja.

Bob Probst
sumber
1
Dalam cuplikan Anda, apakah maxspecifier ajaib ANSI SQL untuk menumbuhkan ukuran VARCHAR seperlunya, atau hanya meta-variabel untuk contoh saja?
Daniel Spiewak
4
Di MySQL Anda kemungkinan besar tidak dapat memiliki varchar yang besar kecuali itu adalah satu-satunya kolom di tabel.
Carson
1
@Daniel Spiewak: "Perbedaan mendasar antara TEXT dan VARCHAR (MAX) adalah bahwa tipe TEXT akan selalu menyimpan data dalam gumpalan sedangkan tipe VARCHAR (MAX) akan mencoba untuk menyimpan data secara langsung di baris kecuali jika melebihi 8k keterbatasan dan pada saat itu menyimpannya dalam gumpalan. " stackoverflow.com/questions/834788/… Tapi pertanyaannya adalah tentang MySQL, jadi ini tidak benar-benar relevan di sini.
Stijn Bollen
9

Anda akan ingin memilih antara kolom TEXT atau VARCHAR berdasarkan seberapa sering URL akan digunakan dan apakah Anda benar - benar membutuhkan panjang untuk dilepaskan.

Gunakan VARCHAR dengan maxlength> = 2.083 seperti yang disarankan micahwittman jika:

  1. Anda akan menggunakan banyak URL per kueri (tidak seperti kolom TEXT, VARCHAR disimpan sejalan dengan baris)
  2. Anda cukup yakin bahwa URL tidak akan pernah melebihi batas-baris 65.535 byte.

Gunakan TEXT jika:

  1. URL tersebut mungkin benar-benar melanggar batas baris 65.535 byte
  2. Kueri Anda tidak akan memilih atau memperbarui banyak URL sekaligus (atau sangat sering). Ini karena kolom TEKS hanya memegang pointer sebaris, dan akses acak yang terlibat dalam mengambil data yang dirujuk bisa menyakitkan.
mrgrieves
sumber
9

Anda harus menggunakan VARCHAR dengan pengkodean karakter ASCII. URL adalah persen disandikan dan nama domain internasional menggunakan punycode sehingga ASCII cukup untuk menyimpannya. Ini akan menggunakan ruang yang jauh lebih sedikit daripada UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Flavio Tordini
sumber
5
bukankah UTF-8 menggunakan lebih banyak ruang padahal hanya perlu?
kommradHomer
7

Ini benar-benar tergantung pada use case Anda (lihat di bawah), tetapi menyimpan karena TEXTmemiliki masalah kinerja, dan VARCHARterdengar sangat berlebihan seperti kebanyakan kasus.

Pendekatan saya: gunakan yang panjang, tapi tidak terlalu besar VARCHAR, seperti VARCHAR(500)atau lebih, dan dorong pengguna yang membutuhkan URL yang lebih besar untuk menggunakan penyingkat URL seperti safe.mn.

Pendekatan Twitter: Untuk UX yang benar-benar bagus, berikan pemendek URL otomatis untuk URL yang terlalu panjang dan simpan "versi tampilan" tautan sebagai potongan URL dengan elips di bagian akhirnya. (Contoh: http://stackoverflow.com/q/219569/1235702akan ditampilkan sebagai stackoverflow.com/q/21956...dan akan menautkan ke URL singkat http://ex.ampl/e1234)

Catatan dan Peringatan

  • Jelas, pendekatan Twitter lebih bagus, tetapi untuk kebutuhan aplikasi saya, merekomendasikan pemendek URL sudah cukup.
  • Penyingkat URL memiliki kelemahan, seperti masalah keamanan. Dalam kasus saya, ini bukan risiko besar karena URL-nya tidak umum dan tidak banyak digunakan; Namun, ini jelas tidak akan berhasil untuk semua orang. safe.mn tampaknya memblokir banyak spam dan URL phising, tetapi saya tetap akan merekomendasikan hati-hati.
  • Pastikan untuk mencatat bahwa Anda tidak boleh memaksa pengguna Anda untuk menggunakan pemendek URL. Untuk sebagian besar kasus (setidaknya untuk kebutuhan aplikasi saya), 500 karakter sudah cukup memadai untuk apa sebagian besar pengguna akan menggunakannya. Hanya gunakan / rekomendasikan penyingkat URL untuk tautan yang terlalu panjang.
brokethebuildagain
sumber
10
Jika Anda menyediakan pemendek url bawaan, bukankah Anda masih perlu menyimpan url lengkap dalam basis data di suatu tempat agar dapat berfungsi? :-)
Neil Neyman
2
Tentu saja; tapi saya ragu kebanyakan orang akan menulis pemendek mereka sendiri. Sejak menulis ini, saya telah belajar bahwa ada banyak API pemendek URL di luar sana (71 terdaftar di sini: programmableweb.com/news/... ), sehingga Anda dapat mengotomatiskan prosesnya tanpa menulis sendiri. Itu masih tergantung pada pengetahuan dan persetujuan pengguna, tentu saja.
brokethebuildagain
3

Saya tidak tahu tentang browser lain, tetapi IE7 memiliki batas karakter 2083 untuk operasi HTTP GET . Kecuali jika ada browser lain yang memiliki batas lebih rendah, saya tidak mengerti mengapa Anda memerlukan lebih dari 2083 karakter.

matt b
sumber
1

Sebagian besar server web memiliki batas panjang URL (itulah sebabnya ada kode kesalahan untuk "URI terlalu panjang"), yang berarti ada ukuran atas yang praktis. Temukan batas panjang default untuk server web paling populer, dan gunakan yang terbesar sebagai ukuran maksimum bidang tersebut; itu harus lebih dari cukup.

CesarB
sumber
1

Anda lebih baik menggunakan varchar (maks) yang (dalam hal ukuran) artinya varchar (65535). Ini bahkan akan menyimpan alamat web Anda yang lebih besar dan akan menghemat ruang Anda juga.

Max specifier memperluas kemampuan penyimpanan tipe data varchar, nvarchar, dan varbinary. varchar (max), nvarchar (max), dan varbinary (max) secara kolektif disebut tipe data bernilai besar. Anda dapat menggunakan tipe data bernilai besar untuk menyimpan hingga 2 ^ 31-1 byte data.

Lihat artikel ini di TechNet tentang menggunakan Menggunakan Tipe Data Nilai Besar

sohaiby
sumber
varchar (max)adalah sintaks SQLServer, tidak cocok untuk MySQL (seperti pada pertanyaan awal). Lebih jauh lagi, itu tidak berarti varchar (65535)karena 65535 adalah jumlah maksimum karakter ASCII dalam satu baris dalam mysql, jadi itu tergantung juga pada bidang lain dan pada set karakter.
Furins