TINYTEXT, TEXT, MEDIUMTEXT ve LONGTEXT maksimum depolama alanı boyutları


796

MySQL belgeleri başına dört TEXT türü vardır:

  1. TINYTEXT
  2. METİN
  3. MEDIUMTEXT
  4. LONGTEXT

Karakter kodlamasının UTF-8 olduğunu varsayarak, her veri türünün bir sütununda saklayabileceğim maksimum uzunluk nedir?


26
Örneğin, METİN türünü ele alalım. 65535 bayt veri içerebilir . UTF-8 çok baytlı karakterler içerir. Bu nedenle, alanı yalnızca Danimarka dili "Ø" kullanarak doldurduysanız, UTF-8 karakteri iki bayttan oluştuğu için yalnızca 32767 karakter alırsınız. "A" ile doldurduysanız 65535 karakter alırsınız.
Andrew Plank

Yanıtlar:


1518

Gönderen belgeler :

      Türü | Maksimum uzunluk
----------- + -------------------------------------
  TINYTEXT | 255 (2 8 −1) bayt
      METİN | 65.535 (2 16 −1) bayt = 64 KiB
MEDIUMTEXT | 16.777.215 (2 24 −1) bayt = 16 MiB
  LONGTEXT | 4.294.967.295 (2 32 −1) bayt = 4 GiB

Sütununuzda saklanabilecek karakter sayısının karakter kodlamasına bağlı olacağını unutmayın .


3
@Bridge Anladığımdan emin değilim, ama bu TINYTEXT'in 255 karaktere kadar alabileceği anlamına geliyor, haklı mıyım ???
ltdev

9
@Lykos Evet, iyi - karakterlere bağlı olarak. Belgelerden: 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.Daha fazla ayrıntı için Ankan'ın cevabına bakınız.
Köprü

4
@ aurel.g Soruyu gerçekten bu şekilde cevaplıyorsunuz. Ve Christophe ile hemfikirim, mySQL parametrelerini bu şekilde sunmalıdır - sırf metin görünümüne ek bir kısayol olsa bile.
cbmtrx

1
Bir karakterin büyüklük sırasının birkaç bayt olduğunu eklemeye değer olabilir (en az 1 sanırım). Yani bir METİN sütununda 10.000-50.000 karakter saklanabilir, ...
Vince

30
Bunu dokümanlarda
yığın akışından

245

Aynı cevabın genişlemesi

  1. Bu SO post , genel giderleri ve depolama mekanizmalarını ayrıntılı olarak açıklamaktadır.
  2. (1) maddesinde belirtildiği gibi, TINYTEXT yerine her zaman bir VARCHAR kullanılmalıdır. Ancak, VARCHAR kullanılırken, maksimum satır boyutu 65535 baytı aşmamalıdır.
  3. Burada belirtildiği gibi http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , utf-8 için maksimum 3 bayt.

HIZLI KARARLAR İÇİN KABA TAHMİN TABLOSU!

  1. Böylece en kötü durum varsayımları (utf-8 karakter başına 3 bayt) en iyi durum (utf-8 karakter başına 1 bayt)
  2. İngilizce dilinin kelime başına ortalama 4,5 harf olduğunu varsayarsak
  3. x, ayrılan bayt sayısıdır

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

Lütfen Chris V'nin cevabına da bakın: https://stackoverflow.com/a/35785869/1881812


4
"TINYTEXT yerine her zaman bir VARCHAR kullanılmalıdır" için mantık nedir? Daha küçük TINYTEXT'i bazen kullanmak daha iyi olmaz (çünkü daha fazla depolama verimli)?
vlasits

24
@vlasits, ayrıntılar için dahil edilen SO yayınını okur. (1) küçük metin de dahil olmak üzere tüm metin türleri, satırın dışında bir adet havai nesne olarak depolanır (2) Bu nesnelere daha sonra 8 veya 16 bayt adresleri ile başvurulur. minik metniniz ne kadar küçük olursa olsun, en fazla 255 bayt için de gereksiz ek yükler eklersiniz. Yukarıdaki ek yüklerden herhangi birine sahip olmayacak olan varchar kullanılması gerektiği açıktır.
Ankan-Zerob

4
@ Ankan-Zerob TINYTEXT'in asla VARCHAR üzerinde kullanılmaması gerektiği çok açık göz önüne alındığında, bir seçenek olarak sunulmasının mantığı nedir? Gerektiğinde bazı belirsiz kullanım örnekleri var mı?
nextgentech

4
@nextgentech göz at dev.mysql.com/doc/refman/5.0/en/column-count-limit.html . Kayıt boyutu 64 KiB ile sınırlıdır. Bir tablo 4k sütunlarla sınırlıdır. A TINYTEXT, kayıt boyutuna karşı 1 bayt + 8 bayt sayarken, kayıt boyutuna karşı VARCHAR(255)1 bayt + 255 bayttan 2 bayta + 1020 bayta (4 bayt UTF-8 karakter) kadar sayar.
Shi

2
Alan boyutlarını kelimelerle ifade etmeyi seviyorum, ama ... İngilizce normalde kelime başına yaklaşık 5 karakter olduğu düşünülüyor ve ayrıca saklanacak bir boşluk karakteri var; ancak, İngilizce her UTF-8 karakteri için 1 bayta yakın olacaktır, bu yüzden farklı boyutlar için yaklaşık 40 / 10.000 / 2.700.000 / 710.000.000 kelime vererek 6'ya bölerdim. Lehçe gibi çok aksanlı diller biraz daha az kelimeye sahip olacaktır; Yunanca, İbranice, Arapça vb. (Çoğunlukla 2 baytlık dizilerle) yaklaşık yarısı; CJK ideografları 3 veya 4 baytlık dizilerdir, ancak kelimelerin ne kadar uzun olduğunu bilmiyorum.
ChrisV

44

@ Ankan-Zerob'un meydan okumasına yükselen bu, kelimelerde ölçülen her metin türünde saklanabilecek maksimum uzunluk tahminimdir :

      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

In İngilizce , kelime başına 4,8 harfleri iyi bir ortalama (örneğin muhtemelen norvig.com/mayzner.html kelime uzunlukları etki alanına göre (akademik yayınlarda vs gibi konuşulan dili) değişecektir rağmen, bu yüzden çok hassas olmaya gerek yoktur). İngilizce çoğunlukla tek baytlı ASCII karakterleri olup, ara sıra çok baytlı karakterlerle harf başına bir bayta çok yakındır. Sözcüklerarası boşluklar için fazladan bir karaktere izin verilmelidir, bu yüzden sözcük başına 5.8 bayttan aşağı yuvarlandım. Lehçe gibi birçok aksanı olan diller, örneğin daha uzun kelimelerle Almanca gibi, biraz daha az kelime depolayacaktır.

Yunanca, Arapça, İbranice, Hintçe, Tayca, vb. Gibi çok baytlık karakterler gerektiren diller , UTF-8'de karakter başına genellikle iki bayt gerektirir. Kelime başına 5 harf çılgınca tahmin ederek, kelime başına 11 bayttan aşağı yuvarladım.

CJK senaryoları (Hanzi, Kanji, Hiragana, Katakana, vb.) Hiçbir şey bilmiyorum; Karakterlerin UTF-8'de çoğunlukla 3 bayt gerektirdiğine ve (büyük basitleştirmeyle) kelime başına yaklaşık 2 karakter kullandıkları düşünülebilir, bu yüzden diğer ikisi arasında bir yerde olurlar. (CJK komut dosyalarının, bağlı olarak UTF-16 kullanarak daha az depolama gerektirmesi olasıdır).

Bu elbette depolama ek yüklerini vb. Yok saymaktadır.


CJK karakterleri 3 veya 4 bayt dizisi kullanabilir: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor

8

Bu güzel ama soruyu cevaplamıyor:

"TINYTEXT yerine her zaman bir VARCHAR kullanılmalıdır." Tinytext, geniş satırlarınız varsa kullanışlıdır - çünkü veriler kayıt dışına kaydedilir. Bir performans yükü var, ancak bir kullanımı var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.