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 .
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.
Jadi ...
<MySQL 5.0.3 gunakan TEXT
atau
> = MySQL 5.0.3 gunakan VARCHAR (2083)
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.
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:
Anda akan menggunakan banyak URL per kueri (tidak seperti kolom TEXT, VARCHAR disimpan sejalan dengan baris)
Anda cukup yakin bahwa URL tidak akan pernah melebihi batas-baris 65.535 byte.
Gunakan TEXT jika:
URL tersebut mungkin benar-benar melanggar batas baris 65.535 byte
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.
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'NOTNULL
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.
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
4
Sebagian besar peramban akan membiarkan Anda memasukkan data dalam jumlah sangat besar ke dalam URL dan dengan demikian banyak hal yang akhirnya menghasilkan URL yang sangat besar, jadi jika Anda berbicara tentang sesuatu yang lebih dari bagian domain dari URL, Anda harus menggunakan kolom TEXT karena VARCHAR / CHAR terbatas .
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.
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.
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
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.
TEXT
tipenya dan lewati membaca semua jawaban di bawah ini. Pada akhirnya, itulah yang kebanyakan dari mereka sarankan. :) Tentu saja, jika Anda memerlukan pengindeksan atau keunikan, gunakanVARCHAR
, karenaTEXT
tidak dapat diindeks dengan mudah .Jawaban:
sumber
VARCHAR(2083)
, cukup gunakanTEXT
.VARCHAR(512)
(atau serupa) harus memadai. Namun, karena Anda tidak benar-benar tahu panjang maksimum URL yang dipermasalahkan, saya mungkin langsung menujuTEXT
. Bahaya dengan ini tentu saja kehilangan efisiensi karenaCLOB
jauh lebih lambat daripada tipe data string sederhanaVARCHAR
.sumber
varchar(max)
untuk SQLServer2005varchar(65535)
untuk MySQL 5.0.3 dan yang lebih baruIni akan mengalokasikan penyimpanan sesuai kebutuhan dan tidak boleh memengaruhi kinerja.
sumber
max
specifier ajaib ANSI SQL untuk menumbuhkan ukuran VARCHAR seperlunya, atau hanya meta-variabel untuk contoh saja?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:
Gunakan TEXT jika:
sumber
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.
sumber
Ini benar-benar tergantung pada use case Anda (lihat di bawah), tetapi menyimpan karena
TEXT
memiliki masalah kinerja, danVARCHAR
terdengar sangat berlebihan seperti kebanyakan kasus.Pendekatan saya: gunakan yang panjang, tapi tidak terlalu besar
VARCHAR
, sepertiVARCHAR(500)
atau lebih, dan dorong pengguna yang membutuhkan URL yang lebih besar untuk menggunakan penyingkat URL sepertisafe.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/1235702
akan ditampilkan sebagaistackoverflow.com/q/21956...
dan akan menautkan ke URL singkathttp://ex.ampl/e1234
)Catatan dan Peringatan
sumber
Sebagian besar peramban akan membiarkan Anda memasukkan data dalam jumlah sangat besar ke dalam URL dan dengan demikian banyak hal yang akhirnya menghasilkan URL yang sangat besar, jadi jika Anda berbicara tentang sesuatu yang lebih dari bagian domain dari URL, Anda harus menggunakan kolom TEXT karena VARCHAR / CHAR terbatas .
sumber
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.
sumber
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.
sumber
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.Lihat artikel ini di TechNet tentang menggunakan Menggunakan Tipe Data Nilai Besar
sumber
varchar (max)
adalah sintaks SQLServer, tidak cocok untuk MySQL (seperti pada pertanyaan awal). Lebih jauh lagi, itu tidak berartivarchar (65535)
karena 65535 adalah jumlah maksimum karakter ASCII dalam satu baris dalam mysql, jadi itu tergantung juga pada bidang lain dan pada set karakter.