Apakah ada alasan untuk menggunakan varchar di atas kolom teks dalam database?

36

Apakah varcharhanya sisa dari sebelum textdatang, atau ada kasus penggunaan di mana Anda ingin menggunakan varchar? (Atau chardalam hal ini ..)

(Saya menggunakan Postgres dan MySQL (MyISAM) setiap hari, jadi itulah yang paling saya minati, tetapi jawaban untuk database lain tentu saja diterima. ^ _-)

Izkata
sumber
6
Setidaknya untuk SQL Server , textsudah usang. Ada juga pertimbangan penggunaan yang terkait dengan tempat data disimpan dan bagaimana hal itu diakses.
Oded
Pada beberapa DBMS Anda mungkin tidak dapat menggunakan kolom teks dalam semacam atau di mana klausa. Saya tidak terbiasa dengan Postgres tetapi periksa dokumentasi Anda.
jqa
1
Pertanyaan StackOverflow ini mungkin menyediakan beberapa info lebih lanjut.
J0ANMM

Jawaban:

32

Secara umum

textkolom tidak standar dan spesifik untuk implementasi. Dalam banyak kasus, tergantung pada database mereka mungkin memiliki kombinasi dari satu atau lebih dari pembatasan berikut: tidak dapat diindeks , tidak dapat dicari dan tidak dapat diurutkan .

Dalam Postgres

Semua tipe ini disimpan secara internal menggunakan struktur data C yang sama. .

Di MySQL

The textkolom adalah versi khususBLOB dan memiliki pembatasan pengindeksan.

Hanya dua contoh ini dapat diekstrapolasi ke sistem RDBMS SQL lainnya dan harus menjadi alasan yang cukup untuk memahami kapan harus memilih satu jenis di atas yang lain.

Hanya untuk membuatnya jelas secara implisit, Anda tidak boleh menggunakannya TEXTkarena hak milik dan non-standar. Apa pun yang SQLAnda tulis tidak akan portabel dan dijamin akan menyebabkan masalah di masa mendatang. Hanya gunakan jenis yang merupakan bagian dari Standar ANSI .

  • Gunakan CHARketika Anda tahu Anda memiliki jumlah karakter tetap untuk setiap entri.
  • Gunakan VARCHARsaat Anda memiliki jumlah karakter yang bervariasi untuk setiap entri.
  • Jika Anda membutuhkan lebih banyak penyimpanan daripada yang VARCHARdapat disediakan, CLOBdengan UTF-8penyandian atau tipe standar yang setara.
  • JANGAN PERNAH digunakan TEXTkarena ini non-standar.

sumber
1
Diterima untuk non standard and implementation specificdan not indexable, not searchable and not sortable, yang tidak kusadari. Aku berada di bawah kesan text itu standar.
Izkata
1
maksud Anda textstandar ASCII atau standar UNICODE text:-) atau salah satu dari setengah lusin textstandar pengkodean lainnya?
1
jika Anda pergi menggali melalui dokumen standar SQL Saya tidak berpikir Anda akan menemukan apa pun textsebagai tipe karakter. Saya belum melihat apa-apa, beberapa vendor menyebutnya long chardan sejenisnya, pada dasarnya adalah BLOB dengan encoding yang melekat padanya.
2
@JarrodRoberson sejujurnya ada banyak sumber daya terkemuka yang menyimpulkan (ketika di lingkungan Postgres) yang "selalu menggunakan TEXT". Jika Anda akan bermigrasi ke database yang berbeda, itu hampir tidak merupakan deal breaker, terutama karena Anda harus mempertimbangkan bahwa postgres tidak terbatas VARCHAR(karena TOAST tidak ada batasan baris seperti misalnya dengan MySQL) tidak dapat diterjemahkan menjadi tidak terbatas VARCHARdi database lain tetap.
Kayaman
1
... dan karena Postgres tidak mendukung CLOB , poin kedua hingga terakhir tidak berlaku. Anda tidak akan pernah bisa mendukung penggantian drop-in meskipun mematuhi standar. Serta menulis ANSI SQL bukanlah pilihan yang layak di dunia nyata, kecuali jika Anda menulis SQL mainan.
Kayaman
11

text, varchardan charsemuanya digunakan karena berbagai alasan. Tentu saja ada perbedaan implementasi (berapa ukuran yang mereka tempati .. dll), tetapi ada juga pertimbangan penggunaan dan niat . Jenis apa yang Anda gunakan juga memberi tahu Anda sesuatu tentang jenis data yang akan disimpan di dalamnya (atau kita semua akan gunakan textuntuk semuanya ). Jika sesuatu memiliki panjang yang tetap, kami gunakan char. Jika memiliki panjang variabel dengan batas atas yang didefinisikan dengan baik maka gunakan varchar. Jika sebagian besar teks yang Anda miliki sedikit kontrol maka textmungkin akan menjadi taruhan terbaik Anda.

Sistem Down
sumber
3
Sooooooo, satu-satunya perbedaan nyata adalah menduplikasi batas-memeriksa yang mungkin harus dalam kode program?
Izkata
2
@Izkata - Ada perbedaan implementasi juga. Ini bukan tentang batas memeriksa, ini tentang tipe data . Kode pos (AS) selalu berupa kode 5 digit, jadi menggunakan sesuatu seperti 'char' menjadi bagian dari definisi potongan data ini. Jika itu hanya hal-hal seperti pengecekan terikat, kita semua bisa menggunakan satu tipe data untuk semuanya dan melakukan pengecekan dan pengecoran sisi kode.
System Down
6
@SystemDown Sejauh yang saya tahu, char, varchar, dan textsemua dirancang untuk menyimpan sama jenis data. Jadi kedua jawaban di sini adalah tentang batas memeriksa. Jika ada perbedaan efisiensi, apakah itu? Mengapa saya menggunakan varcharlebih text?
Izkata
1
float dan double juga digunakan untuk tipe data yang sama, namun mereka memiliki perbedaan dan digunakan secara berbeda. Mengenai perbedaan implementasi, saya tidak cukup mengenal Postgres untuk menjawab bahwa saya takut.
System Down
4
@SystemDown Meskipun menyimpan kode pos sebagai char (5) dapat menggigit Anda jika Anda mulai melakukan internasionalisasi. Kode pos UK panjangnya bervariasi dan 5 karakter hampir tidak pernah cukup. Saya tidak tahu apakah ruang dalam kode pos Inggris relevan untuk penguraian.
Vatine
5

Database sangat memperhatikan kinerja - kecepatan dan meminimalkan penyimpanan. Di sebagian besar bagian lain dunia komputer, Anda tidak akan terganggu dengan berapa banyak karakter dalam string karakter Anda; bisa jadi satu, bisa juga seluruh isi ensiklopedia; itu semua hanya string. Bahkan, banyak bahasa bahkan tidak mengganggu Anda apakah itu string atau angka.

Tetapi ketika komputer menjadi lebih cepat dan mendapatkan lebih banyak memori, orang memasukkan lebih banyak data ke dalam basis data mereka dan melakukan permintaan yang lebih menarik. Untuk basis data, CPU dan memori hanya membatasi hari ini seperti pada hari-hari memori utama 64Kb dan 10 MB hard drive (pada komputer mainframe ).

Jumlah byte yang pasti jauh lebih mudah untuk ditangani daripada jumlah panjang variabel. 10 byte jauh lebih mudah untuk ditangani dari 1.000.000. Jadi basis data Anda ingin Anda memberikannya petunjuk sehingga dapat memberi Anda satu gigabyte hasil dari terrabytes data dalam mikrodetik. Jika Anda tidak menggunakan database Anda dengan susah payah, Anda tidak akan membutuhkan kecepatan yang ditawarkannya dan akan terganggu dengan pertanyaan yang tidak perlu. Tetapi jika Anda benar-benar membutuhkan kinerja, Anda akan dengan senang hati memberikan beberapa petunjuk.

Seperti disebutkan dalam jawaban lain, gunakan charjika selalu menggunakan sejumlah karakter tertentu, varcharjika panjangnya dapat bervariasi tetapi tidak terlalu besar ( tebakan saya kebanyakan DB memperlakukannya sebagai charatau texttergantung pada ukuran), dan textjika itu bisa berapa pun panjangnya. Jika SQL Anda mencoba menggunakan textkolom, mungkin lebih baik untuk meringkasnya entah bagaimana dan meletakkannya di kolom charkecil varcharjuga, lalu lakukan wheredan lakukan order byitu. Tentu saja, itu hanya jika kinerja penting bagi Anda.

RalphChapin
sumber