Tidak ada perbedaan, di bawah kap itu semua varlena
( array panjang variabel ).
Periksa artikel ini dari Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Beberapa highlight:
Singkatnya:
- char (n) - membutuhkan terlalu banyak ruang ketika berhadapan dengan nilai yang lebih pendek dari
n
(bantalannya n
), dan dapat menyebabkan kesalahan halus karena menambahkan spasi tambahan, ditambah itu bermasalah untuk mengubah batas
- varchar (n) - bermasalah untuk mengubah batas di lingkungan langsung (memerlukan kunci eksklusif saat mengubah tabel)
- varchar - seperti halnya teks
- teks - bagi saya pemenang - atas (n) tipe data karena tidak memiliki masalah, dan lebih dari varchar - karena memiliki nama yang berbeda
Artikel ini melakukan pengujian terperinci untuk menunjukkan bahwa kinerja menyisipkan dan memilih untuk semua 4 tipe data serupa. Ini juga membutuhkan perincian cara alternatif untuk membatasi panjang saat dibutuhkan. Batasan berbasis fungsi atau domain memberikan keuntungan peningkatan instan dari batasan panjang, dan atas dasar bahwa mengurangi batasan panjang string jarang terjadi, depesz menyimpulkan bahwa salah satu dari mereka biasanya merupakan pilihan terbaik untuk batas panjang.
Sebagai " Jenis Karakter " di poin dokumentasi keluar,
varchar(n)
,char(n)
, dantext
semua disimpan dengan cara yang sama. Satu-satunya perbedaan adalah siklus tambahan diperlukan untuk memeriksa panjang, jika ada yang diberikan, dan ruang tambahan dan waktu yang dibutuhkan jika padding diperlukan untukchar(n)
.Namun, ketika Anda hanya perlu menyimpan satu karakter, ada sedikit keuntungan kinerja untuk menggunakan tipe khusus
"char"
(mempertahankan tanda kutip ganda - mereka adalah bagian dari nama tipe). Anda mendapatkan akses lebih cepat ke bidang, dan tidak ada overhead untuk menyimpan panjangnya.Saya baru saja membuat tabel 1.000.000 acak yang
"char"
dipilih dari huruf kecil. Kueri untuk mendapatkan distribusi frekuensi (select count(*), field ... group by field
) membutuhkan sekitar 650 milidetik, vs sekitar 760 pada data yang sama menggunakantext
bidang.sumber
"char"
tidakchar
?? Apakah ini berlaku di PostgreSQL 11+ saat ini? ... Ya: "Tipe"char"
(perhatikan tanda kutip) berbeda dari char (1) karena hanya menggunakan satu byte penyimpanan. Ini digunakan secara internal dalam katalog sistem sebagai tipe enumerasi sederhana ." , panduan / tipe data-karakter .MEMPERBARUI BENCHMARKS UNTUK 2016 (hal9.5 +)
Dan menggunakan tolok ukur "SQL murni" (tanpa skrip eksternal)
gunakan string_generator dengan UTF8
tolok ukur utama:
2.1. MEMASUKKAN
2.2. PILIH membandingkan dan menghitung
Siapkan tes khusus (contoh)
Lakukan tes dasar:
Dan tes lainnya,
... Dan gunakan
EXPLAIN ANALYZE
.DIPERBARUI LAGI 2018 (hal 10)
sedikit edit untuk menambahkan hasil 2018 dan memperkuat rekomendasi.
Hasil pada 2016 dan 2018
Hasil saya, setelah rata-rata, di banyak mesin dan banyak tes: semua sama
(secara statistik kurang dari standar deviasi tham).
Rekomendasi
Gunakan
text
tipe data,hindari yang lama
varchar(x)
karena terkadang ini bukan standar, misalnya dalamCREATE FUNCTION
klausavarchar(x)
≠varchar(y)
.menyatakan batas (dengan
varchar
kinerja yang sama !) dengan denganCHECK
klausa dalamCREATE TABLE
mis
CHECK(char_length(x)<=10)
.Dengan hilangnya kinerja yang dapat diabaikan dalam INSERT / UPDATE Anda juga dapat mengontrol rentang dan struktur string
misalnya
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
sumber
"char"
, itu tidakchar
, bahkan di PostgreSQL 11+ saat ini. Sebagai panduan / datatype karakter mengatakan "Tipe"char"
(perhatikan tanda kutip) berbeda dari char (1) dalam hal itu hanya menggunakan satu byte penyimpanan. Hal ini secara internal digunakan dalam katalog sistem sebagai jenis pencacahan sederhana ." .Pada manual PostgreSQL
Saya biasanya menggunakan teks
Referensi: http://www.postgresql.org/docs/current/static/datatype-character.html
sumber
Menurut saya,
varchar(n)
memiliki kelebihan itu sendiri. Ya, mereka semua menggunakan tipe dasar yang sama dan semua itu. Tetapi, harus ditunjukkan bahwa indeks dalam PostgreSQL memiliki batas ukuran 2712 byte per baris.TL; DR: Jika Anda menggunakan
text
tipe tanpa kendala dan memiliki indeks pada kolom ini, sangat mungkin Anda menekan batas ini untuk beberapa kolom Anda dan mendapatkan kesalahan ketika Anda mencoba memasukkan data tetapi dengan menggunakanvarchar(n)
, Anda dapat mencegahnya.Beberapa perincian lebih lanjut: Masalahnya di sini adalah PostgreSQL tidak memberikan pengecualian saat membuat indeks untuk
text
tipe atau divarchar(n)
manan
lebih besar dari 2712. Namun, itu akan memberikan kesalahan ketika catatan dengan ukuran terkompresi lebih besar dari 2712 dicoba untuk dimasukkan. Ini berarti bahwa Anda dapat memasukkan 100.000 karakter string yang disusun oleh karakter berulang dengan mudah karena akan dikompresi jauh di bawah 2712 tetapi Anda mungkin tidak dapat memasukkan beberapa string dengan 4000 karakter karena ukuran terkompresi lebih besar dari 2712 byte. Menggunakanvarchar(n)
tempatn
yang tidak terlalu besar dari 2712, Anda aman dari kesalahan ini.sumber
teks dan varchar memiliki konversi tipe implisit yang berbeda. Dampak terbesar yang saya perhatikan adalah penanganan ruang trailing. Sebagai contoh ...
kembali
true, false, true
dan tidaktrue, true, true
seperti yang Anda harapkan.sumber
Agaknya OT: Jika Anda menggunakan Rails, pemformatan standar laman web mungkin berbeda. Untuk formulir entri data,
text
kotak dapat digulir, tetapi kotakcharacter varying
(Relstring
) adalah satu baris. Tampilkan tampilan selama diperlukan.sumber
Penjelasan yang bagus dari http://www.sqlines.com/postgresql/datatypes/text :
sumber
character varying(n)
,varchar(n)
- (Keduanya sama). nilai akan dipotong ke n karakter tanpa menimbulkan kesalahan.character(n)
,char(n)
- (Keduanya sama). panjang tetap dan akan pad dengan kosong sampai akhir panjang.text
- Panjang tidak terbatas.Contoh:
Kami mendapatkan hasil:
sumber