Saya setuju dengan semua yang dikatakan oleh a_horse_with_no_name, dan saya umumnya setuju dengan saran komentar Erwin:
Tidak, char lebih rendah (dan ketinggalan jaman). teks dan varchar melakukan (hampir) sama.
Metadata
Dengan satu pengecualian kecil, satu - satunya waktu yang saya gunakan char()
adalah ketika saya ingin meta-data mengatakan ini HARUS memiliki x-karakter. Meskipun saya tahu bahwa char()
hanya mengeluh jika inputnya melebihi batas, saya akan sering melindungi dari underruns dalam CHECK
kendala. Sebagai contoh,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Saya melakukan ini karena beberapa alasan,
char(x)
kadang-kadang disimpulkan dengan skema-loader sebagai kolom dengan lebar tetap. Ini mungkin membuat perbedaan dalam bahasa yang dioptimalkan untuk string dengan lebar tetap.
- Ini menetapkan konvensi yang masuk akal dan mudah ditegakkan. Saya dapat menulis skema-loader dalam bahasa untuk menghasilkan kode dari konvensi ini.
Perlu contoh di mana saya dapat melakukan ini,
- Singkatan dua huruf, meskipun karena daftar ini dapat disebutkan, saya biasanya akan melakukannya dengan
ENUM
.
- Nomor Identifikasi Kendaraan
- Nomor Model (dari ukuran tetap)
Kesalahan
Perhatikan bahwa beberapa orang mungkin merasa tidak nyaman dengan ketidaksesuaian pesan kesalahan di kedua sisi batas, tetapi itu tidak mengganggu saya
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Kontras dengan varchar
Selain itu, saya pikir saran di atas sangat cocok dengan konvensi yang hampir selalu digunakantext
. Anda bertanya tentang varchar(n)
juga. Saya tidak pernah menggunakannya . Setidaknya, saya tidak ingat kapan terakhir kali saya menggunakan varchar(n)
.
- Jika spec memiliki bidang lebar statis yang saya percayai, saya menggunakan
char(n)
,
- Kalau tidak, saya menggunakan
text
yang efektif varchar
(tanpa batas)
Jika saya menemukan spec yang memiliki kunci teks panjang variabel yang bermakna dan saya percaya memiliki panjang maksimum konstan, saya akan menggunakan varchar(n)
juga. Namun, saya tidak bisa memikirkan apa pun yang cocok dengan kriteria itu.
Catatan tambahan
Tanya Jawab terkait: