Berapa ukuran maksimum MySQL VARCHAR?

300

Saya ingin tahu apa ukuran maksimal untuk tipe MySQL VARCHAR.

Saya membaca bahwa ukuran maks dibatasi oleh ukuran baris yaitu sekitar 65k. Saya mencoba mengatur bidang ke varchar(20000)tetapi mengatakan bahwa itu terlalu besar.

Saya bisa mengaturnya varchar(10000). Apa tepatnya maks yang saya bisa atur?

pengguna1832628
sumber
1
Blog detail: goo.gl/Hli6G3
Suresh Kamrushi

Jawaban:

293

Perlu diingat bahwa MySQL memiliki batas ukuran baris maksimum

Representasi internal tabel MySQL memiliki batas ukuran baris maksimum 65.535 byte, tidak termasuk tipe BLOB dan TEXT. Kolom BLOB dan TEXT hanya berkontribusi 9 hingga 12 byte terhadap batas ukuran baris karena isinya disimpan secara terpisah dari sisa baris. Baca lebih lanjut tentang Batas pada Jumlah Kolom Tabel dan Ukuran Baris.

Ukuran maksimum yang dapat ditempati satu kolom, berbeda sebelum dan sesudah MySQL 5.0.3

Nilai dalam kolom VARCHAR adalah string panjang variabel. Panjangnya dapat ditentukan sebagai nilai dari 0 hingga 255 sebelum MySQL 5.0.3, dan 0 hingga 65.535 dalam versi 5.0.3 dan yang lebih baru. Panjang maksimum efektif dari VARCHAR di MySQL 5.0.3 dan yang lebih baru tunduk pada ukuran baris maksimum (65.535 byte, yang dibagi di antara semua kolom) dan rangkaian karakter yang digunakan.

Namun, perhatikan bahwa batasnya lebih rendah jika Anda menggunakan set karakter multi-byte seperti utf8 atau utf8mb4.

Gunakan TEXTjenis inorder untuk mengatasi batas ukuran baris.

Keempat jenis TEXT adalah TINYTEXT, TEXT, MEDIUMTEXT, dan LONGTEXT. Ini sesuai dengan empat jenis BLOB dan memiliki panjang maksimum dan persyaratan penyimpanan yang sama.

Lebih detail tentang Jenis BLOB dan TEKS

Bahkan lebih

Lihat detail lebih lanjut tentang Persyaratan Penyimpanan Tipe Data yang berkaitan dengan persyaratan penyimpanan untuk semua tipe data.

rajukoyilandy
sumber
4
apa itu string "panjang"?
Richard H
6
Saya mencoba untuk menghindari kolom TEKS karena mereka dapat menyebabkan tabel temp dibuat ketika hadir dan mengurutkan
Robert Swisher
1
Jika saya menggunakan varchar (200) untuk nama depan dan saya hanya menyimpan 6 karakter di bidang ini, maka berapa byte nama depan yang akan ditempati?
Paresh Gami
2
@PareshGami - 6 + 1 = 7 karakter! Berbeda dengan CHAR, nilai VARCHAR disimpan sebagai awalan panjang plus 1 byte atau 2 byte. lebih lanjut ...
rajukoyilandy
58

Sesuai dokumen online , ada batas baris 64 ribu dan Anda bisa menentukan ukuran baris dengan menggunakan:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Anda harus ingat bahwa panjang kolom bukan pemetaan satu-ke-satu dari ukurannya. Sebagai contoh, CHAR(10) CHARACTER SET utf8membutuhkan tiga byte untuk masing-masing dari sepuluh karakter karena pengkodean tertentu harus memperhitungkan properti tiga-byte-per-karakter dari utf8(itu pengkodean MySQLutf8 daripada UTF-8 "nyata", yang dapat memiliki hingga empat byte ).

Tetapi, jika ukuran baris Anda mendekati 64K, Anda mungkin ingin memeriksa skema database Anda. Ini adalah tabel langka yang perlu selebar itu dalam database yang diatur dengan benar (3NF) - itu mungkin, hanya saja tidak terlalu umum.

Jika Anda ingin menggunakan lebih dari itu, Anda dapat menggunakan BLOBatauTEXT tipe . Ini tidak diperhitungkan terhadap batas baris 64K (selain jejak administratif kecil) tetapi Anda harus mengetahui masalah lain yang berasal dari penggunaannya, seperti tidak dapat mengurutkan menggunakan seluruh blok teks di luar angka tertentu karakter (meskipun ini dapat dikonfigurasi ke atas), memaksa tabel sementara berada di disk daripada di memori, atau harus mengkonfigurasi klien dan server comms buffer untuk menangani ukuran secara efisien.

Ukuran yang diizinkan adalah:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Anda masih memiliki ketidakcocokan byte / karakter (sehingga MEDIUMTEXT utf8kolom dapat menyimpan "hanya" sekitar setengah juta karakter (16M-1)/3 = 5,592,405) , tetapi masih sangat memperluas jangkauan Anda.

paxdiablo
sumber
4
Perlu diingat bahwa tipe TEXT TIDAK dapat disimpan dalam tabel memori, jadi ada penalti kinerja yang signifikan untuk menggunakannya saat VARCHAR akan mencukupi.
Camden S.
'properti tiga-byte-per-karakter utf8' dari MySql utf8 , yang sebenarnya bukan utf8 sama sekali. Pada kenyataannya maks. byte dalam utf-8 char adalah 4 . Untuk alasan ini, Anda harus selalu mengatur penyandian utf8mb4di MySQL . utf8mb4adalah nama MySql untuk apa kata selebihnya disebut utf8.
Stijn de Witt
1
@StijndeWitt, terima kasih untuk itu. diklarifikasi untuk menunjukkan saya maksudkan metode pengkodean utf8 MySQL daripada UTF-8. Saya biasanya menggunakan varian huruf kapital untuk menunjukkan "nyata" UTF-8 karena itulah konvensi IANA yang diterima.
paxdiablo
41

Sumber

Panjang maksimal varchar tunduk pada ukuran baris maks di MySQL, yaitu 64KB (tidak termasuk BLOB):

VARCHAR (65535) Namun, perhatikan bahwa batasnya lebih rendah jika Anda menggunakan set karakter multi-byte:

VARCHAR (21844) SET KARAKTER utf8

Attila
sumber
20
Harap berhenti menggunakan CHARACTER SET utf8dalam contoh. Seharusnya CHARACTER SET utf8mb4(jika Anda ingin semua teks Unicode disimpan dengan benar ... dan siapa yang tidak menginginkannya?)
Stijn de Witt
4
Untuk CHARSET=utf8mb4penggunaan VARCHAR(16383).
Wil Moore III
3
Menggunakan utf8mb4 akan membuat Anda melawan batas lebar indeks dalam situasi di mana utf8 tidak. Jika Anda memeriksa set karakter yang termasuk dalam utf8mb4 tetapi tidak dalam utf8, Anda mungkin menemukan bahwa termasuk semua berbagai bentuk hieroglif dan set karakter misterius lainnya tidak sebanding dengan penalti kinerja yang signifikan (ditentukan secara empiris). Ini tidak cukup memotong dan mengeringkan seperti yang disiratkan Stijn.
kcrossen
Banyak emoji juga ada di utf8mb4 dan hilang dari utf8, sehingga dapat mengubah persamaan apakah itu berharga.
Brian Morearty
23

Dari dokumentasi MySQL:

Panjang maksimum efektif dari VARCHAR di MySQL 5.0.3 dan yang lebih baru tergantung pada ukuran baris maksimum (65.535 byte, yang dibagi di antara semua kolom) dan rangkaian karakter yang digunakan. Misalnya, karakter utf8 dapat memerlukan hingga tiga byte per karakter, sehingga kolom VARCHAR yang menggunakan rangkaian karakter utf8 dapat dinyatakan maksimum 21.844 karakter.

Batas untuk VARCHAR bervariasi tergantung pada rangkaian karakter yang digunakan. Menggunakan ASCII akan menggunakan 1 byte per karakter. Berarti Anda bisa menyimpan 65.535 karakter. Menggunakan utf8 akan menggunakan 3 byte per karakter yang menghasilkan batas karakter 21.844. TETAPI jika Anda menggunakan utf8mb4 multibyte charset modern yang harus Anda gunakan! Ini mendukung emoji dan karakter khusus lainnya. Ini akan menggunakan 4 byte per karakter. Ini akan membatasi jumlah karakter per tabel menjadi 16.383. Perhatikan bahwa bidang lain seperti INT juga akan dihitung hingga batas ini.

Kesimpulan:

utf8 maksimum 21.844 karakter

utf8mb4 maksimum 16.383 karakter

Firze
sumber
6

Anda juga dapat menggunakan MEDIUMBLOB / LONGBLOB atau MEDIUMTEXT / LONGTEXT

Tipe BLOB di MySQL dapat menyimpan hingga 65.534 byte, jika Anda mencoba untuk menyimpan lebih dari data ini, MySQL akan memotong data. MEDIUMBLOB dapat menyimpan hingga 16.777.213 byte, dan LONGBLOB dapat menyimpan hingga 4.294.967.292 byte.

SRIRAM
sumber
3

Sebelum Mysql versi 5.0.3 Varchar datatype dapat menyimpan 255 karakter, tetapi dari 5.0.3 dapat menyimpan 65.535 karakter.

TETAPI memiliki batasan ukuran baris maksimum 65.535 byte. Itu berarti termasuk semua kolom itu tidak boleh lebih dari 65.535 byte.

Dalam kasus Anda mungkin bahwa ketika Anda mencoba untuk mengatur lebih dari 10.000 itu melebihi lebih dari 65.535 dan mysql akan memberikan kesalahan.

Untuk informasi lebih lanjut: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog dengan contoh: http://goo.gl/Hli6G3

Suresh Kamrushi
sumber
-5

Anda dapat menggunakan TEXTtipe , yang tidak terbatas pada 64KB.

mvp
sumber
31
Ini tidak menjawab pertanyaan.
DreamWave
1
Jawaban Anda tidak relevan dengan pertanyaan.
Girish