Panjang maksimum untuk teks jenis MySQL

437

Saya membuat formulir untuk mengirim pesan pribadi dan ingin menetapkan maxlengthnilai textarea yang sesuai dengan panjang maksimum textbidang dalam tabel database MySQL saya. Berapa banyak karakter yang dapat disimpan oleh jenis teks?

Jika banyak, apakah saya dapat menentukan panjang di bidang jenis teks basis data seperti yang saya lakukan dengan varchar?

CyberJunkie
sumber
5
Mengetik 64k ke dalam bidang teks sederhana? menyakitkan ...
Marc B
169
@ Mark B Jangan pernah meremehkan kemampuan pengguna untuk menempelkan sampah dalam jumlah besar ke dalam bidang pesan teks pribadi.
simontemplar
5
Dan itulah mengapa Anda harus membatasi kapasitas textfield dan selalu memvalidasi input Anda ...
jpangamarca

Jawaban:

750

Lihat untuk angka maksimum: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

TINYBLOB, TINYTEXT       L + 1 bytes, where L < 2^8    (255 Bytes)
BLOB, TEXT               L + 2 bytes, where L < 2^16   (64 Kilobytes)
MEDIUMBLOB, MEDIUMTEXT   L + 3 bytes, where L < 2^24   (16 Megabytes)
LONGBLOB, LONGTEXT       L + 4 bytes, where L < 2^32   (4 Gigabytes)

L adalah jumlah byte di bidang teks Anda. Jadi jumlah karakter maksimum untuk teks adalah 2 16 -1 (menggunakan karakter byte tunggal). Berarti 65.535 karakter (menggunakan karakter byte tunggal).

Pengkodean UTF-8 / MultiByte : menggunakan pengodean MultiByte, setiap karakter dapat menggunakan lebih dari 1 byte ruang. Untuk konsumsi ruang UTF-8 adalah antara 1 hingga 4 byte per karakter.

saudara
sumber
2
@ fyr- Di sini apa artinya untuk L + 2 byte, di mana L <2 ^ 16? Bisakah Anda lebih mendefinisikannya? Bijaksana lain Anda bisa memberi tahu saya berapa banyak karakter yang bisa kita simpan di bidang teks? Tolong ....
Bajrang
2
@JJ L adalah jumlah karakter dan jumlah karakter harus kurang dari 2 pangkat 16. 2 ^ 16 = 65536. Jadi, Anda dapat memasukkan 65535 karakter yang mengkonsumsi 65535 byte + 3 byte = 65 538 byte per penuh bidang isian.
fyr
9
Perhatikan bahwa batas ukuran dalam byte . Jadi jika Anda menggunakan karakter multi-byte, Anda tidak mendapatkan 2 ^ 16 karakter dalam kolom TEXT, Anda mendapatkan banyak karakter yang dapat Anda simpan dalam 2 ^ 16 byte.
Bill Karwin
4
Apa kata Bill Karwin. Byte, BUKAN KARAKTER. Karakter dapat menggunakan 4 byte untuk menyimpan dengan pengkodean yang diberikan (seperti 💩 di UTF-8).
basic6
8
Perhatikan bahwa di MySQL, utf8 mengkonsumsi hingga 3 byte, utf8mb4 mengkonsumsi hingga 4. referensi
mpen
126

TINYTEXT: 256 byte
TEKS: 65.535 byte
MEDIUMTEXT: 16.777.215 byte
PANJANG: 4.294.967.295 byte

Cristian Oana
sumber
10
Saya pikir TINYTEXT harus 255 byte, bukan 256 byte, menurut jawaban yang diterima?
cytsunny
83
Type       | Approx. Length     | Exact Max. Length Allowed
-----------------------------------------------------------
TINYTEXT   | 256 Bytes          |           255 characters
TEXT       |  64 Kilobytes      |        65,535 characters
MEDIUMTEXT |  16 Megabytes      |    16,777,215 characters
LONGTEXT   |   4 Gigabytes      | 4,294,967,295 characters

Catatan: Jika menggunakan karakter multibyte (seperti bahasa Arab, di mana setiap karakter bahasa Arab membutuhkan 2 byte), kolom "Exact Max. Length Allowed" untuk TINYTEXTdapat menampung hingga 127 karakter Arab (Catatan: spasi, tanda hubung, garis bawah, dan karakter lain semacam itu , adalah karakter 1-byte).

Pada dasarnya, ini seperti:

"Exact Max. Length Allowed" = "Approx. Length" dalam bytes - 1

evilReiko
sumber
18

Menurut http://dev.mysql.com/doc/refman/5.0/id/storage-requirements.html , batasnya adalah L + 2 bytes, where L < 2^16, atau 64k.

Anda tidak perlu khawatir dengan membatasi, secara otomatis dipecah menjadi potongan-potongan yang ditambahkan saat string tumbuh, sehingga tidak selalu menggunakan 64k secara membabi buta.

Buta
sumber
8

Berapa banyak karakter yang dapat disimpan oleh jenis teks?

Menurut Documentation Anda dapat menggunakan maksimum 21.844 karakter jika charset adalah UTF8

Jika banyak, apakah saya dapat menentukan panjang di bidang jenis teks db seperti yang saya lakukan dengan varchar?

Anda tidak perlu menentukan panjangnya. Jika Anda membutuhkan lebih banyak karakter, gunakan tipe data MEDIUMTEXT atau LONGTEXT. Dengan VARCHAR, panjang spesifik bukan untuk persyaratan Penyimpanan, itu hanya untuk bagaimana data diambil dari basis data.

SCC
sumber
8
TINYTEXT 256 bytes
TEXT 65,535 bytes ~64kb
MEDIUMTEXT 16,777,215 bytes ~16MB
LONGTEXT 4,294,967,295 bytes ~4GB

TINYTEXT adalah tipe data string yang dapat menyimpan hingga 255 karakter.

TEXTadalah tipe data string yang dapat menyimpan hingga 65,535karakter. TEXTumumnya digunakan untuk artikel singkat.

LONGTEXTadalah tipe data string dengan panjang 4,294,967,295karakter maksimum . Gunakan LONGTEXTjika Anda perlu menyimpan teks besar, seperti bab dari novel.

Sachith
sumber
1

TEXTadalah tipe data string yang dapat menyimpan hingga 65.535 karakter. Tapi tetap saja jika Anda ingin menyimpan lebih banyak data maka ubah tipe datanya menjadiLONGTEXT

ALTER TABLE name_tabelCHANGE text_fieldSET LONGTEXT CHARACTER SET utf8LAGI utf8_general_ciBUKAN;

sohel shaikh
sumber
1

Untuk versi MySql 8.0.

Persyaratan Penyimpanan Tipe Numerik

Data Type       Storage Required
TINYINT         1 byte
SMALLINT        2 bytes
MEDIUMINT       3 bytes
INT, INTEGER    4 bytes
BIGINT          8 bytes
FLOAT(p)        4 bytes if 0 <= p <= 24, 8 bytes if 25 <= p <= 53
FLOAT           4 bytes
DOUBLE, REAL    8 bytes
DECIMAL(M,D), NUMERIC(M,D)  Varies; see following discussion
BIT(M)  approximately (M+7)/8 bytes

Nilai untuk kolom DECIMAL (dan NUMERIC) direpresentasikan menggunakan format biner yang mengemas sembilan angka desimal (basis 10) menjadi empat byte. Penyimpanan untuk bagian bilangan bulat dan pecahan dari masing-masing nilai ditentukan secara terpisah. Setiap kelipatan sembilan digit membutuhkan empat byte, dan digit "sisa" memerlukan beberapa fraksi dari empat byte. Penyimpanan yang diperlukan untuk kelebihan digit diberikan oleh tabel berikut.

Persyaratan Penyimpanan Tipe Tanggal dan Waktu Untuk kolom TIME, DATETIME, dan TIMESTAMP, penyimpanan yang diperlukan untuk tabel yang dibuat sebelum MySQL 5.6.4 berbeda dari tabel yang dibuat dari 5.6.4 pada. Ini disebabkan oleh perubahan pada 5.6.4 yang memungkinkan tipe-tipe ini memiliki bagian fraksional, yang membutuhkan dari 0 hingga 3 byte.

Data Type   Storage Required Before MySQL 5.6.4   Storage Required as of MySQL 5.6.4
YEAR        1 byte                                1 byte
DATE        3 bytes                               3 bytes
TIME        3 bytes                               3 bytes + fractional seconds storage
DATETIME    8 bytes                               5 bytes + fractional seconds storage
TIMESTAMP   4 bytes                               4 bytes + fractional seconds storage

Pada MySQL 5.6.4, penyimpanan untuk YEAR dan DATE tetap tidak berubah. Namun, TIME, DATETIME, dan TIMESTAMP terwakili secara berbeda. DATETIME dikemas lebih efisien, membutuhkan 5 daripada 8 byte untuk bagian yang tidak praktis, dan ketiga bagian memiliki bagian fraksional yang membutuhkan dari 0 hingga 3 byte, tergantung pada ketepatan detik fraksional dari nilai yang disimpan.

Fractional Seconds Precision    Storage Required
0                               0 bytes
1, 2                            1 byte
3, 4                            2 bytes
5, 6                            3 bytes

Misalnya, TIME (0), TIME (2), TIME (4), dan TIME (6) masing-masing menggunakan 3, 4, 5, dan 6 byte. TIME dan TIME (0) sama dan membutuhkan penyimpanan yang sama.

Untuk detail tentang representasi internal nilai temporal, lihat MySQL Internal: Algoritma dan Struktur Penting.

Persyaratan Penyimpanan Tipe String Dalam tabel berikut, M menunjukkan panjang kolom yang dinyatakan dalam karakter untuk tipe string non-biner dan byte untuk tipe string biner. L mewakili panjang aktual dalam byte dari nilai string yang diberikan.

Data Type                    Storage Required
CHAR(M)                      The compact family of InnoDB row formats optimize storage for variable-length character sets. See COMPACT Row Format Characteristics. Otherwise, M × w bytes, <= M <= 255, where w is the number of bytes required for the maximum-length character in the character set.
BINARY(M)                    M bytes, 0 <= M <= 255
VARCHAR(M), VARBINARY(M)     L + 1 bytes if column values require 0 − 255 bytes, L + 2 bytes if values may require more than 255 bytes
TINYBLOB, TINYTEXT           L + 1 bytes, where L < 28
BLOB, TEXT                   L + 2 bytes, where L < 216
MEDIUMBLOB, MEDIUMTEXT       L + 3 bytes, where L < 224
LONGBLOB, LONGTEXT           L + 4 bytes, where L < 232
ENUM('value1','value2',...)  1 or 2 bytes, depending on the number of enumeration values (65,535 values maximum)
SET('value1','value2',...)   1, 2, 3, 4, or 8 bytes, depending on the number of set members (64 members maximum)
Rohit.007
sumber