Apa perbedaan antara VARCHAR dan CHAR?

366

Apa perbedaan antara VARCHAR dan CHAR di MySQL?

Saya mencoba menyimpan hash MD5.

steven
sumber
15
Hash MD5 selalu memiliki 32 karakter. Karena itu untuk memaksimalkan kinerja Anda, gunakan CHAR (32) karena CHAR adalah panjang tetap (lihat jawaban di bawah untuk detail lebih lanjut tentang perbedaan antara CHAR dan VARCHAR).
Augustin

Jawaban:

361

VARCHAR panjang variabel.

CHAR adalah panjang tetap.

Jika konten Anda berukuran tetap, Anda akan mendapatkan kinerja yang lebih baik CHAR.

Lihat halaman MySQL pada CHAR dan VARCHAR Jenis untuk penjelasan rinci (pastikan juga membaca komentar).

Segera.
sumber
51
@steven: ketika Anon. mengatakan "konten Anda adalah ukuran tetap" itu berarti baris tabel Anda harus berisi semua bidang ukuran tetap. Anda tidak mendapatkan peningkatan kinerja jika Anda menggunakan CHAR terhadap VARCHAR di satu bidang, tetapi tabel berisi bidang lain yang VARCHAR.
Marco Demaio
2
no char datatype menambahkan kinerja ... saat mengeksekusi kueri sql akan menghasilkan rencana eksekusi. Asumsikan ada 2 kolom charcol char (2000) dan VarcharCol Varchar (2000). Dalam rencana pelaksanaan, estimasi ukuran baris untuk jenis kolom varchar mungkin di bawah perkiraan. dengan demikian itu menyebabkan tumpahan ke temp db. Jadi menggunakan char bagus untuk kinerja
vignesh
1
apa arti dari nilai dalam paranthesis VARCHAR (n)?
Sivagami Nambi
@Marco Demaio apakah Anda tahu alasan di balik ini?
Dehan de Croos
1
@ jdc91: untuk meningkatkan kinerja, seluruh baris harus memiliki lebar tetap. MySQL mendapatkan keuntungan dengan menghitung persyaratan ruang dan mengimbangi baris dalam tabel semacam itu.
Marco Demaio
225

ARANG

  1. Digunakan untuk menyimpan nilai string karakter dengan panjang tetap .
  2. Maksimum tidak. karakter yang dapat disimpan oleh tipe data adalah 255 karakter .
  3. Ini 50% lebih cepat dari VARCHAR.
  4. Menggunakan alokasi memori statis .

VARCHAR

  1. Digunakan untuk menyimpan data alfanumerik panjang variabel .
  2. Maksimum yang dapat ditampung oleh tipe data ini
    • Pra-MySQL 5.0.3: 255 karakter .
    • Post-MySQL 5.0.3: 65.535 karakter dibagi untuk baris.
  3. Ini lebih lambat dari CHAR.
  4. Menggunakan alokasi memori dinamis .
simplePerson43
sumber
3
Saya sedikit terkejut bahwa jawaban ini telah begitu sering dinaikkan. Dokumentasi MySQL menyatakanValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS
2
belum lagi Anda dapat menyimpan data alfanumerik di char juga
ninjabber
44
Apa ini 50% lebih cepat berdasarkan? 50% lebih cepat untuk melakukan apa? Dalam kondisi apa? Dan apa yang Anda maksud dengan alokasi memori statis vs dinamis dalam konteks ini?
Martin Smith
4
@ MartinSmith Saya akan menanyakan hal yang sama .. jangan berpikir bahwa informasi itu akurat. asktom.oracle.com/pls/asktom/…
Ozgur Bar
2
-1; klaim kinerja di sini tidak jelas dan tidak berdasar, perbedaan dalam strategi alokasi memori (dan mengapa itu penting) tidak disempurnakan, dan klaim bahwa varchar menyimpan "data alfanumerik" agak aneh; kolom varchar tentu saja dapat menyimpan karakter non-alfanumerik!
Mark Amery
122

CHAR Vs VARCHAR

CHAR digunakan untuk Variabel Ukuran Panjang Tetap.
VARCHAR digunakan untuk Variabel Ukuran Panjang.

Misalnya

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

Output akan menjadi

length(City)          Length(street)
10                    6

Kesimpulan: Untuk menggunakan ruang penyimpanan secara efisien harus menggunakan VARCHAR sebagai ganti CHAR jika panjang variabel adalah variabel

P Sharma
sumber
4
City = char (10), Street = varchar (10), city = Pune, street = Oxford, panjang (city) = 4, length (street) = 6
abdulwadood
2
kueri ini (pilih panjang (kota), panjang (jalan) dari temp) memberikan output berikut di mysql 5.7 mysql> pilih panjang (kota), panjang (jalan) dari temp; + -------------- + ---------------- + | panjang (kota) | panjang (jalan) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 baris dalam set (0,00 dtk)
Jasbeer Rawal
69

Sebuah CHAR(x)kolom hanya dapat memiliki persis x karakter.
Sebuah VARCHAR(x)kolom dapat memiliki hingga x karakter.

Karena hash MD5 Anda akan selalu berukuran sama, Anda mungkin harus menggunakan a CHAR.

Namun, Anda seharusnya tidak menggunakan MD5 sejak awal; itu sudah diketahui kelemahannya.
Gunakan SHA2 sebagai gantinya.
Jika Anda membuat kata sandi, Anda harus menggunakan bcrypt.

Slaks
sumber
44
"Kolom CHAR (x) hanya dapat memiliki karakter x yang tepat." Sebenarnya, Anda dapat menambahkan data dengan kurang dari x chars, tapi saya pikir Anda bermaksud selalu MEMILIKI memori senilai 10 chars di belakang layar.
Dan W
13
Anda tidak tahu mengapa mereka menyimpan hash md5, ada banyak, banyak alasan yang sah untuk menggunakan md5 yang tidak ada hubungannya dengan keamanan. Tabrakan tidak umum sama sekali dan algoritma lebih cepat daripada yang lebih aman.
John Hunt
1
Dengan asumsi bahwa kolom CHAR (x) tidak menegakkan karakter x persis apakah ada alasan untuk menggunakannya di atas VARCHAR (x) bahkan untuk data ukuran tetap?
NeverEndingQueue
11

Apa perbedaan antara VARCHAR dan CHAR di MySQL?

Untuk jawaban yang sudah diberikan saya ingin menambahkan bahwa dalam sistem OLTP atau dalam sistem dengan pembaruan sering mempertimbangkan menggunakan CHARbahkan untuk kolom ukuran variabel karena kemungkinan VARCHARfragmentasi kolom selama pembaruan.

Saya mencoba menyimpan hash MD5.

Hash MD5 bukan pilihan terbaik jika keamanan benar-benar penting. Namun, jika Anda akan menggunakan fungsi hash apa pun, pertimbangkan BINARYuntuk mengetiknya saja (mis. MD5 akan menghasilkan hash 16-byte, jadi BINARY(16)cukup CHAR(32)untuk 32 karakter yang mewakili digit hex. Ini akan menghemat lebih banyak ruang dan efektif kinerja.

Grygoriy Gonchar
sumber
Mengikuti pemikiran ini, saya akan menggunakan CHAR untuk ID bisnis yang dimaksudkan untuk keterbacaan vs efisiensi. Saya masih akan menggunakan kunci primer bigint.
Archimedes Trajano
9

Varchar memotong spasi tambahan jika karakter yang dimasukkan lebih pendek dari panjang yang dinyatakan, sedangkan char tidak akan. Char akan mengisi spasi dan akan selalu menjadi panjang dari panjang yang dinyatakan. Dalam hal efisiensi, varchar lebih mahir karena memangkas karakter untuk memungkinkan lebih banyak penyesuaian. Namun, jika Anda tahu panjang persisnya char, char akan mengeksekusi dengan sedikit lebih cepat.

pengguna1445657
sumber
7

Dalam sebagian besar RDBMS hari ini, mereka adalah sinonim. Namun untuk sistem yang masih memiliki perbedaan, bidang CHAR disimpan sebagai kolom dengan lebar tetap. Jika Anda mendefinisikannya sebagai CHAR (10), maka 10 karakter ditulis ke tabel, di mana "padding" (biasanya spasi) digunakan untuk mengisi ruang apa pun yang data tidak digunakan. Misalnya, menyimpan "bob" akan disimpan sebagai ("bob" +7 spasi). Kolom VARCHAR (karakter variabel) dimaksudkan untuk menyimpan data tanpa membuang ruang ekstra yang dilakukan oleh kolom CHAR.

Seperti biasa, Wikipedia berbicara lebih keras.

mobiGeek
sumber
5

CHAR adalah bidang panjang tetap; VARCHAR adalah bidang panjang variabel. Jika Anda menyimpan string dengan panjang variabel liar seperti nama, kemudian gunakan VARCHAR, jika panjangnya selalu sama, maka gunakan CHAR karena sedikit lebih hemat ukuran, dan juga sedikit lebih cepat.

Andrew
sumber
Walaupun saya menduga bahwa klaim tentang kecepatan dan efisiensi penyimpanan di sini benar, tidak satu pun dari mereka dibuktikan dengan cara apa pun (dan sangat masuk akal bahwa mereka salah), yang membuat jawaban ini tidak berguna; itu hanya mengulangi apa yang mungkin sudah pembaca akan benar, tanpa melakukan apa pun untuk benar-benar membantu mengonfirmasi.
Mark Amery
1

CHAR adalah panjang tetap dan VARCHAR adalah panjang variabel. CHAR selalu menggunakan jumlah ruang penyimpanan yang sama per entri, sementara VARCHAR hanya menggunakan jumlah yang diperlukan untuk menyimpan teks yang sebenarnya.

Donnie DeBoer
sumber
1

Char adalah tipe data karakter dengan panjang tetap, varchar adalah tipe data karakter dengan panjang variabel.

Karena char adalah tipe data panjang tetap, ukuran penyimpanan nilai char sama dengan ukuran maksimum untuk kolom ini. Karena varchar adalah tipe data panjang variabel, ukuran penyimpanan nilai varchar adalah panjang sebenarnya dari data yang dimasukkan, bukan ukuran maksimum untuk kolom ini.

Anda dapat menggunakan char saat entri data dalam kolom diharapkan memiliki ukuran yang sama. Anda dapat menggunakan varchar ketika entri data dalam kolom diharapkan bervariasi ukurannya.

Bob Minteer
sumber
0

menurut buku MySQL Kinerja Tinggi :

VARCHAR menyimpan string karakter panjang variabel dan merupakan tipe data string yang paling umum. Ini dapat membutuhkan lebih sedikit ruang penyimpanan daripada jenis dengan panjang tetap, karena hanya menggunakan ruang sebanyak yang dibutuhkan (yaitu, lebih sedikit ruang yang digunakan untuk menyimpan nilai yang lebih pendek). Pengecualiannya adalah tabel MyISAM yang dibuat dengan ROW_FORMAT = FIXED, yang menggunakan jumlah ruang pada disk yang tetap untuk setiap baris dan karenanya dapat membuang ruang. VARCHAR membantu kinerja karena menghemat ruang.

Panjang CHAR adalah tetap: MySQL selalu mengalokasikan ruang yang cukup untuk jumlah karakter yang ditentukan. Saat menyimpan nilai CHAR, MySQL menghapus spasi tambahan. (Ini juga berlaku untuk VARCHAR di MySQL 4.1 dan versi yang lebih lama — CHAR dan VAR CHAR secara logis identik dan hanya berbeda dalam format penyimpanan.) Nilai diisi dengan ruang yang diperlukan untuk perbandingan.

Alireza Rahmani Khalili
sumber
2
" VARCHAR membantu kinerja karena menghemat ruang " Ini menghemat ruang, ya, tapi bukankah itu berdampak negatif terhadap kinerja? VARCHARperlu mengalokasikan memori secara dinamis ketika dan ketika diperlukan sehingga mengurangi kinerja yang bertentangan CHAR, kan?
Spikatrix
@Spikatrix Tergantung. Jika nilai-nilai VARCHAR sering kecil tetapi bisa sampai N byte, maka alokasi dinamis dapat menghemat sejumlah besar ruang dan I / O, yang lebih berkinerja untuk banyak data. Nilai CHAR yang panjangnya kira-kira sama akan lebih berkinerja. Baca dan tulis juga mungkin membuat perbedaan.
Andrew
-4

Char memiliki panjang yang tetap (mendukung 2000 karakter), artinya karakter adalah tipe data

Varchar memiliki panjang variabel (mendukung 4000 karakter)

Amandeep
sumber
-1; angka-angka ini tidak benar untuk MySQL. (Saya pikir mereka mungkin untuk Oracle?)
Mark Amery
-5

Char atau varchar- itu digunakan untuk memasukkan data texual di mana panjangnya dapat ditunjukkan dalam tanda kurung Contoh nama char (20)

Amy
sumber
Ini tidak menjawab pertanyaan awal. OP menanyakan perbedaan praktis antara jenis, bukan sintaks dan tujuan jenis. Juga (dan )yang kurung, tidak kurung.
2mac
@ 2mac kalimat terakhir Anda hanya berlaku untuk Bahasa Inggris Amerika; di Inggris kami memanggil (dan )tanda kurung, dan banyak orang Inggris mungkin bahkan tidak menyadari bahwa ada dialek bahasa Inggris di mana kata "tanda kurung" dapat merujuk ke tanda baca. Ada kasus kuat yang harus dibuat untuk memilih "kurung" ke "kurung" - itu mungkin, pada keseimbangan, opsi maksimal jelas ketika menargetkan audiens internasional pemrogram - tapi itu kasus yang lebih rumit daripada "kurung" hanya menjadi salah.
Mark Amery
-11

CHAR:

  • Mendukung Karakter & Angka.
  • Mendukung 2000 karakter.
  • Panjang Tetap.

VARCHAR:

  • Mendukung Karakter & Angka.
  • Mendukung 4000 karakter.
  • Panjang Variabel.

ada komentar......!!!!

YRSREDDY
sumber