Setara dengan varchar (maks) di MySQL?

170

Apa yang setara dengan varchar (maks) di MySQL?

David Basarab
sumber

Jawaban:

195

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 rangkaian karakter multi-byte:

VARCHAR(21844) CHARACTER SET utf8

Berikut ini beberapa contohnya:

Ukuran baris maksimum adalah 65535, tetapi varchar juga menyertakan satu atau dua byte untuk mengkodekan panjang string yang diberikan. Jadi Anda sebenarnya tidak dapat mendeklarasikan varchar dengan ukuran baris maksimum, bahkan jika itu adalah satu-satunya kolom dalam tabel.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Tetapi jika kita mencoba mengurangi panjang, kita menemukan panjang terbesar yang berfungsi:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Sekarang jika kita mencoba menggunakan charset multibyte di tingkat tabel, kita menemukan bahwa itu menghitung setiap karakter sebagai beberapa byte. String UTF8 tidak harus menggunakan beberapa byte per string, tetapi MySQL tidak dapat mengasumsikan Anda akan membatasi semua sisipan masa depan Anda ke karakter byte tunggal.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Terlepas dari apa yang dikatakan kesalahan terakhir kami, InnoDB masih tidak menyukai panjang 21845.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Ini masuk akal, jika Anda menghitung bahwa 21845 * 3 = 65535, yang tidak akan berhasil. Sedangkan 21844 * 3 = 65532, yang bekerja.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
Bill Karwin
sumber
20
Saya juga menyarankan menggunakan TEXT
Adi
2
@ AdnanShammout: Tentu, kecuali jika Anda ingin mendeklarasikan DEFAULTnilai untuk kolom. Tidak dapat melakukannya dengan jenis TEKS atau Gumpalan.
Bill Karwin
5
@ DanW, TEXTbatas panjangnya 64 ribu . MEDIUMTEXTbatas panjang adalah 16M. LONGTEXTbatas panjangnya adalah 4G.
Bill Karwin
4
Masalah terbesar dengan ini adalah bahwa jika Anda membuat kolom dengan ukuran itu, Anda hanya dapat memiliki satu kolom di tabel Anda. The MAX ukuran baris di MySql adalah 64k, jadi jika Anda memiliki kolom 64k, itu saja yang Anda dapatkan. Batasan yang sama ini tidak berlaku untuk varchar(max)jenis kolom Sql Server .
joshperry
1
@joshperry, ya tapi TEXT / BLOB kolom hanya menghitung jumlah kecil (9-12 byte) terhadap batas ukuran baris 64KB, jadi jika Anda memerlukan VARCHAR besar serta sejumlah kolom lainnya, lebih baik menggunakan TEXT.
Bill Karwin
74

TLDR; MySql tidak memiliki konsep yang setara varchar(max), ini adalah fitur MS SQL Server.

Apa itu VARCHAR (maks)?

varchar(max) adalah fitur dari Microsoft SQL Server.

Jumlah data yang dapat disimpan kolom dalam versi Microsoft SQL server sebelum versi 2005 terbatas pada 8KB. Untuk menyimpan lebih dari 8KB Anda harus menggunakan TEXT,, NTEXTatau BLOBtipe kolom, tipe kolom ini menyimpan data mereka sebagai kumpulan 8K halaman yang terpisah dari halaman data tabel; mereka mendukung penyimpanan hingga 2GB per baris.

The peringatan besar untuk jenis kolom ini adalah bahwa mereka biasanya diperlukan fungsi dan pernyataan khusus untuk mengakses dan memodifikasi data (misalnya READTEXT, WRITETEXT, dan UPDATETEXT)

Dalam SQL Server 2005, varchar(max)diperkenalkan untuk menyatukan data dan permintaan yang digunakan untuk mengambil dan memodifikasi data dalam kolom besar. Data untuk varchar(max)kolom disimpan sejalan dengan halaman data tabel.

Karena data di kolom MAX mengisi halaman data 8KB, maka halaman melimpah dialokasikan dan halaman sebelumnya menunjuk ke sana membentuk daftar tertaut. Tidak seperti TEXT, NTEXT, dan BLOByang varchar(max)jenis kolom mendukung semua semantik query yang sama seperti jenis kolom lainnya.

Jadi varchar(MAX)sangat berarti varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)dan tidak varchar(MAX_SIZE_OF_A_COLUMN).

MySql tidak memiliki idiom yang setara.

Untuk mendapatkan jumlah penyimpanan yang sama dengan varchar(max)di MySql Anda masih perlu menggunakan BLOBjenis kolom. Artikel ini membahas metode yang sangat efektif untuk menyimpan sejumlah besar data di MySql secara efisien.

Joshperry
sumber
1
Ini lebih berkaitan dengan SQL Server daripada MySQL.
Kermit
14
@ njk Ya, tetapi untuk menjelaskan apa yang "setara" di MySql (atau tidak adanya yang setara dalam kasus ini) diperlukan untuk menjelaskan dengan tepat apa sebenarnya arti varchar(max) sebenarnya .
joshperry
29

Panjang maksimal varchar adalah

65535

dibagi dengan panjang byte maksimal karakter dalam set karakter, kolom diatur ke (mis. utf8 = 3 byte, ucs2 = 2, latin1 = 1).

minus 2 byte untuk menyimpan panjangnya

minus panjang semua kolom lainnya

minus 1 byte untuk setiap 8 kolom yang dapat dibatalkan. Jika kolom Anda adalah nol / bukan nol ini akan disimpan sebagai satu bit dalam byte / byte yang disebut topeng nol, 1 bit per kolom yang dapat nullable.

ʞɔıu
sumber
Saya menyukai format jawaban Anda tetapi sepertinya tidak ada beberapa informasi berguna yang disediakan oleh jawaban teratas mengenai charset dan lainnya
Joe Phillips
3

Untuk Sql Server

ubah tabel prg_ar_report_colors tambahkan Text_Color_Code VARCHAR (maks);

Untuk MySql

ubah tabel prg_ar_report_colors tambahkan Text_Color_Code longtext;

Untuk Oracle

ubah tabel prg_ar_report_colors tambahkan Text_Color_Code CLOB;

Parit Dinanath
sumber
1
perhatikan bahwa teks panjang, teks dan gumpalan disimpan berbeda dari varchar. varchar disimpan dengan bidang lain, sementara teks disimpan pada file terpisah di server. ia memiliki pro dan kontra yang sangat hati-hati mana yang harus dipilih
santiago arizti
0

Kolom Mysql Konversi dari VARCHAR ke TEXT ketika di bawah ukuran batas !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>
zloctb
sumber
-11

Panjang maksimal varchar di MySQL 5.6.12 adalah 4294967295.

ajabep
sumber