Ukuran penyimpanan maksimum TINYTEXT, TEXT, MEDIUMTEXT, dan LONGTEXT

796

Per dokumen MySQL , ada empat jenis TEXT:

  1. TINYTEXT
  2. TEKS
  3. MEDIUMTEXT
  4. PANJANG

Berapa panjang maksimum yang bisa saya simpan di kolom setiap tipe data dengan asumsi pengkodean karakter adalah UTF-8?

Lalith B
sumber
26
Ambil contoh jenis TEXT. Ini dapat berisi 65535 byte data. UTF-8 berisi karakter multi-byte. Oleh karena itu, jika Anda mengisi bidang hanya menggunakan karakter Denmark "Ø", Anda hanya akan mendapatkan 32.767 karakter, karena karakter UTF-8 terdiri dari dua byte. Jika Anda mengisinya dengan "a", Anda akan mendapatkan 65535 karakter.
Andrew Plank
1
Pertimbangkan juga untuk membaca DATATYPE mana yang lebih baik menggunakan TEXT atau VARCHAR
Somnath Muluk

Jawaban:

1518

Dari dokumentasi :

      Ketik | Panjang maksimum
----------- + -------------------------------------
  TINYTEXT | 255 (2 8 −1) byte
      TEXT | 65.535 (2 16 −1) byte = 64 KiB
MEDIUMTEXT | 16.777.215 (2 24 −1) byte = 16 MiB
  PANJANG | 4.294.967.295 (2 32 −1) byte = 4 GiB

Perhatikan bahwa jumlah karakter yang dapat disimpan di kolom Anda akan tergantung pada pengkodean karakter .

Jembatan
sumber
3
@Bridge Tidak yakin saya mengerti, tetapi ini berarti bahwa TINYTEXT dapat memperoleh hingga 255 karakter, apakah saya benar ???
ltdev
9
@ Lykos Ya, yah - tergantung pada karakter. Dari dokumentasi: A TEXT column with a maximum length of 255 (28 – 1) characters. The effective maximum length is less if the value contains multi-byte characters.Lihat jawaban Ankan untuk lebih detail.
Jembatan
4
@ aurel.g Beginilah cara Anda menjawab pertanyaan. Dan saya setuju dengan Christophe, ini adalah bagaimana mySQL harus menyajikan parameternya - bahkan jika hanya sebagai steno tambahan untuk ... tampilan teks misterius.
cbmtrx
1
Mungkin perlu ditambahkan bahwa urutan besarnya karakter adalah beberapa byte (min. 1 saya kira). Jadi seseorang dapat menyimpan 10.000-50.000 karakter dalam kolom TEKS, ...
Vince
30
Mengapa lebih sulit untuk menemukan ini di dokumen daripada di stackoverflow
Boris D. Teoharov
245

Perluasan jawaban yang sama

  1. Posting SO ini menguraikan secara rinci overhead dan mekanisme penyimpanan.
  2. Seperti disebutkan dari poin (1), VARCHAR harus selalu digunakan sebagai ganti TINYTEXT. Namun, ketika menggunakan VARCHAR, ukuran maksimum baris tidak boleh melebihi 65535 byte.
  3. Seperti diuraikan di sini http://dev.mysql.com/doc/refman/5.0/id/charset-unicode-utf8.html , maks 3 byte untuk utf-8.

INI ADALAH MEJA ESTIMASI KASAR UNTUK KEPUTUSAN CEPAT!

  1. Jadi asumsi kasus terburuk (3 byte per utf-8 char) untuk case terbaik (1 byte per utf-8 char)
  2. Dengan asumsi bahasa Inggris memiliki rata-rata 4,5 huruf per kata
  3. x adalah jumlah byte yang dialokasikan

xx

      Type | A= worst case (x/3) | B = best case (x) | words estimate (A/4.5) - (B/4.5)
-----------+---------------------------------------------------------------------------
  TINYTEXT |              85     | 255               | 18 - 56
      TEXT |          21,845     | 65,535            | 4,854.44 - 14,563.33  
MEDIUMTEXT |       5,592,415     | 16,777,215        | 1,242,758.8 - 3,728,270
  LONGTEXT |   1,431,655,765     | 4,294,967,295     | 318,145,725.5 - 954,437,176.6

Silakan merujuk ke jawaban Chris V juga: https://stackoverflow.com/a/35785869/1881812

Ankan-Zerob
sumber
4
Apa alasan untuk ini "VARCHAR harus selalu digunakan, bukan TINYTEXT"? Bukankah lebih baik (karena penyimpanan lebih efisien) untuk menggunakan TINYTEXT yang lebih kecil kadang-kadang?
vlasits
24
@las membaca pos SO disertakan untuk detail. (1) semua jenis teks, termasuk tinytext disimpan sebagai objek di luar baris yang merupakan satu overhead (2) Objek ini kemudian direferensikan oleh alamat 8 atau 16 byte. jadi, sekecil apa pun tinytext Anda, Anda menambahkan overhead yang tidak perlu, itu juga untuk ukuran maksimal 255 byte. jelas bahwa varchar harus digunakan, yang tidak akan memiliki overhead di atas.
Ankan-Zerob
4
@ Ankan-Zerob Mengingat tampaknya sangat jelas bahwa TINYTEXT tidak boleh digunakan di atas VARCHAR, apa alasan untuk bahkan menjadikannya sebagai opsi? Apakah ada case-use yang tidak jelas jika diperlukan?
nextgentech
4
@nextgentech Lihat di dev.mysql.com/doc/refman/5.0/en/column-count-limit.html . Ukuran catatan terbatas hingga 64 KiB. Tabel terbatas pada kolom 4k. A TINYTEXTmenghitung 1 byte + 8 byte terhadap ukuran rekaman, sedangkan VARCHAR(255)hitungan dari 1 byte + 255 byte hingga 2 byte + 1020 byte (4 byte UTF-8 karakter) terhadap ukuran rekaman.
Shi
2
Saya suka mengungkapkan ukuran bidang dalam kata-kata, tapi ... Bahasa Inggris biasanya dianggap memiliki sekitar 5 karakter per kata, dan ada juga karakter ruang yang akan disimpan; Namun, bahasa Inggris akan selalu mendekati 1 byte per karakter UTF-8, jadi saya akan membagi dengan 6 memberikan sekitar 40 / 10.000 / 2.700.000 / 710.000.000 kata untuk ukuran yang berbeda. Bahasa dengan banyak aksen seperti Polandia akan memiliki kata-kata yang sedikit lebih sedikit; Yunani, Ibrani, Arab, dll (dengan sebagian besar urutan 2-byte) sekitar setengahnya; Ideograf CJK adalah urutan 3 atau 4-byte, tapi saya tidak tahu berapa lama kata-kata itu.
ChrisV
44

Naik ke tantangan @ Ankan-Zerob, ini adalah perkiraan panjang maksimum saya yang dapat disimpan dalam setiap jenis teks yang diukur dengan kata-kata :

      Type |         Bytes | English words | Multi-byte words
-----------+---------------+---------------+-----------------
  TINYTEXT |           255 |           ±44 |              ±23
      TEXT |        65,535 |       ±11,000 |           ±5,900
MEDIUMTEXT |    16,777,215 |    ±2,800,000 |       ±1,500,000
  LONGTEXT | 4,294,967,295 |  ±740,000,000 |     ±380,000,000

Dalam bahasa Inggris , 4,8 huruf per kata mungkin rata-rata yang baik (misalnya norvig.com/mayzner.html ), meskipun panjang kata akan bervariasi sesuai dengan domain (mis. Bahasa lisan vs makalah akademis), jadi tidak ada gunanya terlalu tepat. Bahasa Inggris sebagian besar adalah karakter ASCII byte tunggal, dengan karakter multi-byte yang sangat jarang terjadi, sangat dekat dengan satu byte per huruf. Karakter tambahan harus diizinkan untuk spasi antar kata, jadi saya telah membulatkan dari 5,8 byte per kata. Bahasa dengan banyak aksen seperti mengatakan Polandia akan menyimpan kata-kata yang sedikit lebih sedikit, seperti misalnya bahasa Jerman dengan kata-kata yang lebih panjang.

Bahasa yang membutuhkan karakter multi-byte seperti Yunani, Arab, Ibrani, Hindi, Thailand, dll, dll biasanya memerlukan dua byte per karakter di UTF-8. Tebak liar di 5 huruf per kata, saya sudah dibulatkan dari 11 byte per kata.

Skrip CJK (Hanzi, Kanji, Hiragana, Katakana, dll) Saya tidak tahu apa-apa tentang; Saya percaya sebagian besar karakter memerlukan 3 byte di UTF-8, dan (dengan penyederhanaan besar-besaran) mereka mungkin dianggap menggunakan sekitar 2 karakter per kata, sehingga mereka akan berada di antara dua karakter lainnya. (Skrip CJK cenderung membutuhkan lebih sedikit penyimpanan menggunakan UTF-16, tergantung).

Ini tentu saja mengabaikan biaya penyimpanan dll.

ChrisV
sumber
Karakter CJK dapat menggunakan urutan 3 atau 4 byte: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor
8

Ini bagus tetapi tidak menjawab pertanyaan:

"VARCHAR harus selalu digunakan daripada TINYTEXT." Tinytext berguna jika Anda memiliki baris lebar - karena data disimpan tidak direkam. Ada overhead kinerja, tetapi memang ada gunanya.

colin0117
sumber