Jawabannya adalah tidak .
Jangan tambahkan pengubah panjang varchar
jika Anda bisa menghindarinya. Sebagian besar waktu, Anda sebenarnya tidak membutuhkan batasan panjang. Cukup gunakan text
untuk semua data karakter. Buat itu varchar
(tanpa pengubah panjang) jika Anda harus tetap kompatibel dengan RDBMS yang tidak memiliki text
.
Kinerja hampir sama - text
adalah sedikit lebih cepat dalam situasi langka , dan Anda menyimpan siklus untuk memeriksa panjang.
Jika Anda benar - benar perlu menegakkan panjang maksimum, masih menggunakan text
dan menambahkan batasan pemeriksaan untuk itu:
ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);
Anda dapat memodifikasi atau menjatuhkan batasan seperti itu kapan saja tanpa harus mengacaukan definisi tabel dan semua objek yang bergantung (tampilan, fungsi, kunci asing, ...)
Dengan pengubah panjang Anda hanya mengalami masalah seperti ini atau ini atau ini ...
PostgreSQL 9.1 memperkenalkan fitur baru untuk mengurangi rasa sakit. Saya mengutip catatan rilis di sini :
Izinkan ALTER TABLE ... SET DATA TYPE
untuk menghindari penulisan ulang tabel dalam kasus yang sesuai (Noah Misch, Robert Haas)
Misalnya, mengonversi varchar
kolom ke teks tidak lagi membutuhkan penulisan ulang tabel. Namun, meningkatkan batasan panjang pada
varchar
kolom masih membutuhkan penulisan ulang tabel.
Erwin Brandstetter
sumber
varchar(n)
bagaimanapun juga, untuk kesederhanaan - jika kerugiannya biasanya tidak mempengaruhi Anda. (Batas tidak sewenang - wenang dalam kasus Anda jika Anda ingin menegakkan panjang maksimum aktual.)Jika Anda melihat batas panjang sebagai semacam batasan periksa untuk memastikan Anda memvalidasi data, maka ya tambahkan satu. Sebenarnya Anda mungkin ingin tidak menggunakan definisi panjang tetapi kendala cek nyata sebagai gantinya, untuk membuat mengubah batas lebih cepat.
Untuk mengubah (menambah) batas panjang, Anda perlu menjalankan
ALTER TABLE
yang mungkin membutuhkan waktu lama untuk menyelesaikan (karena kemungkinan penulisan ulang tabel) di mana diperlukan kunci meja eksklusif.Mengubah (yaitu menjatuhkan dan menciptakan kembali) kendala pemeriksaan adalah operasi yang sangat singkat dan hanya membutuhkan membaca data tabel, itu tidak akan mengubah baris apa pun. Jadi itu akan menjadi jauh lebih cepat (yang pada gilirannya berarti kunci meja eksklusif akan ditahan untuk waktu yang jauh lebih singkat).
Selama operasi tidak ada perbedaan apapun antara a
text
, avarchar
atauvarchar(5000)
kolom.sumber
Pertanyaannya secara khusus apakah menambahkan batas panjang arbitrer ke kolom VARCHAR?
Untuk itu, jawabannya hanyalah "tidak". Tidak ada yang dapat membenarkan penambahan batas arbitrer seperti yang Anda lakukan pada basis data inferior yang mendukung
varchar(max)
atau menggunakan konvensivarchar(255)
. Namun, jika spec membahas batasan, saya pikir jawabannya menjadi jauh lebih kompleks terutama pada versi modern PostgreSQL. Dan, untuk itu, saya akan condong ke arah YA .Menurut pendapat saya, batasnya adalah pilihan bijak jika spec mengharuskannya. Terutama untuk beban kerja yang lebih masuk akal. Jika tanpa alasan lain maka untuk mempertahankan meta-data.
Dari jawaban saya di sini, kinerja indeks untuk CHAR vs VARCHAR (Postgres) , di mana saya membahas nilai meta-data.
sumber
Sepertinya ada beberapa perbedaan kinerja jika
VARCHAR
digunakan secara teratur untuk menyimpan string yang sangat besar, karena "string panjang dikompresi oleh sistem secara otomatis" dan "nilai yang sangat lama juga disimpan dalam tabel latar belakang." Secara teoritis ini berarti bahwa permintaan volume tinggi untuk bidang string yang sangat panjang akan lebih lambat daripada untuk bidang string pendek. Anda mungkin tidak akan pernah mengalami masalah ini, karena nama dan alamat tidak akan terlalu panjang.Namun, tergantung pada bagaimana Anda menggunakan string ini di luar basis data Anda, Anda mungkin ingin menambahkan batas praktis untuk mencegah penyalahgunaan sistem. Misalnya, jika Anda menampilkan nama dan alamat pada formulir di suatu tempat, Anda mungkin tidak dapat menampilkan seluruh paragraf teks di bidang "nama", jadi masuk akal untuk membatasi kolom nama menjadi sekitar 500 karakter.
sumber
VARCHAR
adalah gula sintaksis murni untukTEXT
di Postgres, tidak ada perbedaan dalam penanganan penyimpanan; kompresi vs penyimpanan tabel latar belakang yang Anda sebutkan dilakukan berdasarkan pada panjang aktual data dalam kolom dan bukan pada metadata kolom. Kolom TEXT disimpan secara internal sebagaivarlena
C struct (yang merupakan array panjang variabel dengan 4 byte pertama menyimpan panjang di buat / perbarui) dan ini adalah struct yang dioptimalkan berdasarkan panjangnya.