TINYTEXT, TEXT, MEDIUMTEXT 및 LONGTEXT 최대 저장소 크기


796

MySQL의 문서 , 네 개의 텍스트 종류가 있습니다 :

  1. TINYTEXT
  2. 본문
  3. 중간 텍스트
  4. 긴 텍스트

문자 인코딩이 UTF-8이라고 가정 할 때 각 데이터 유형의 열에 저장할 수있는 최대 길이는 얼마입니까?


26
TEXT 유형을 예로 들어 보겠습니다. 65535 바이트 의 데이터를 포함 할 수 있습니다 . UTF-8은 멀티 바이트 문자를 포함합니다. 따라서 덴마크 문자 "Ø"만 사용하여 필드를 채운 경우 UTF-8 문자는 2 바이트로 구성되므로 32767 자만 얻을 수 있습니다. "a"로 채운 경우 65535 자입니다.
Andrew Plank

답변:


1518

로부터 문서 :

      타입 | 최대 길이
----------- + -------------------------------------
  TINYTEXT | 255 (2 8 -1) 바이트
      텍스트 | 65,535 (2 16 -1) 바이트 = 64 킬로바이트
MEDIUMTEXT | 16,777,215 (2 24 -1) = 16 바이트 MiB 크기
  긴 텍스트 | 4294967295 (2 32 -1) = 4 바이트 지브

수 있습니다 문자 당신의 컬럼에 저장 될 수에 따라 달라집니다 문자 인코딩 .


3
@Bridge 잘 모르겠지만 TINYTEXT가 최대 255자를 얻을 수 있음을 의미합니다.
ltdev

9
@Lykos 네, 캐릭터에 따라 다릅니다. 설명서에서 : 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.자세한 내용은 Ankan의 답변을 참조하십시오.
Bridge

4
@ aurel.g 이것이 당신이 실제로 질문에 대답하는 방법입니다. 그리고 나는 Christophe에 동의합니다. 이것은 mySQL이 매개 변수를 제시하는 방법입니다.
cbmtrx

1
문자의 크기 순서는 몇 바이트 (최소한 1)라고 덧붙일 가치가 있습니다. 따라서 TEXT 열에 10,000-50,000 개의 문자를 저장할 수 있습니다.
Vince

30
왜 유래에 비해 문서에이를 찾기 위해 어렵게입니다
보리스 D. Teoharov

245

같은 답변의 확장

  1. SO 포스트 는 오버 헤드 및 스토리지 메커니즘에 대해 자세히 설명합니다.
  2. 포인트 (1)에서 언급했듯이 TINYTEXT 대신 항상 VARCHAR을 사용해야합니다. 그러나 VARCHAR을 사용할 때 최대 행 크기는 65535 바이트를 초과하지 않아야합니다.
  3. 여기에 설명 된대로 http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , utf-8의 경우 최대 3 바이트.

이것은 빠른 결정을위한 견고한 추정 테이블입니다!

  1. 따라서 최악의 가정 (utf-8 문자 당 3 바이트)에서 최상의 경우 (utf-8 문자 당 1 바이트)
  2. 영어가 단어 당 평균 4.5 자라고 가정
  3. x는 할당 된 바이트 수입니다.

배반

      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

Chris V의 답변도 참조하십시오 : https://stackoverflow.com/a/35785869/1881812


4
이 "TINYTEXT 대신 항상 VARCHAR을 사용해야한다"는 이론적 근거는 무엇입니까? 더 작은 TINYTEXT를 사용하는 것이 (스토리지 효율이 높기 때문에) 더 좋지 않습니까?
vlasits

24
@vlasits는 포함 된 SO 게시물을 읽고 자세한 내용을 확인하십시오. (1) 작은 텍스트를 포함한 모든 텍스트 유형은 하나의 오버 헤드 인 행 외부의 객체로 저장됩니다. (2)이 객체는 주소 8 또는 16 바이트로 참조됩니다. 작은 텍스트가 아무리 작아도 불필요한 오버 헤드를 추가하고 최대 크기는 255 바이트입니다. 위의 오버 헤드가없는 varchar를 사용해야합니다.
Ankan-Zerob

4
@ Ankan-Zerob TINYTEXT를 VARCHAR보다 절대 사용해서는 안된다는 것이 분명해 보인다면 옵션으로 사용하는 이유도 무엇입니까? 필요한 경우 모호한 사용 사례가 있습니까?
nextgentech

4
@nextgentech에서 찾아 보게 dev.mysql.com/doc/refman/5.0/en/column-count-limit.html을 . 레코드 크기는 64 KiB로 제한됩니다. 테이블은 4k 열로 제한됩니다. A TINYTEXT는 레코드 크기에 대해 1 바이트 + 8 바이트를 VARCHAR(255)계산 하는 반면 레코드 크기에 대해서는 1 바이트 + 255 바이트에서 최대 2 바이트 + 1020 바이트 (4 바이트 UTF-8 문자)까지 카운트합니다.
Shi

2
나는 필드 크기를 단어로 표현하는 것을 좋아하지만 ... 영어는 일반적으로 단어 당 약 5자를 가진 것으로 간주되며 저장 될 공백 문자도 있습니다. 그러나 영어는 항상 UTF-8 문자 당 1 바이트에 가깝기 때문에 다른 크기에 대해 약 40 / 10,000 / 2,700,000 / 710,000,000 단어를 6으로 나눕니다. 폴란드어와 같이 악센트가 많은 언어는 단어가 약간 적습니다. 그리스어, 히브리어, 아랍어 등 (대부분 2 바이트 시퀀스) 약 절반; CJK 표의 문자는 3 바이트 또는 4 바이트 시퀀스이지만 단어의 길이는 모르겠습니다.
ChrisV

44

@ Ankan-Zerob의 도전으로, 이것은 단어로 측정 된 각 텍스트 유형에 저장할 수있는 최대 길이의 추정치입니다 .

      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

에서 영어 , 단어 당 4.8 문자 좋은 평균 (예 : 아마 norvig.com/mayzner.html 워드 길이가 도메인에 따라 (학술 논문 대 예를 들어 음성 언어) 달라질 수 있지만, 너무 너무 정확한 것을 아무 소용이 없다). 영어는 대부분 1 바이트 ASCII 문자이며, 가끔씩 멀티 바이트 문자를 사용하므로 문자 당 1 바이트에 가깝습니다. 단어 간 공백에는 추가 문자가 허용되어야하므로 단어 당 5.8 바이트에서 반올림했습니다. 폴란드어와 같이 악센트가 많은 언어는 단어가 더 적은 독일어와 같이 단어가 약간 적게 저장됩니다.

그리스어, 아랍어, 히브리어, 힌디어, 태국어 등과 같은 멀티 바이트 문자가 필요한 언어는 일반적으로 UTF-8에서 문자 당 2 바이트가 필요합니다. 단어 당 5 글자를 거칠게 추측하면서 단어 당 11 바이트에서 반올림했습니다.

CJK 스크립트 (한지, 한자, 히라가나, 가타카나 등) 나는 아무것도 모른다. 나는 문자가 UTF-8에서 주로 3 바이트를 필요로한다고 생각하고 (단순화하면) 단어 당 약 2 문자를 사용하는 것으로 간주 될 수 있으므로 다른 두 문자 사이에있을 것입니다. (CJK 스크립트는 UTF-16을 사용하여 스토리지를 덜 필요로 할 수 있습니다).

이것은 물론 스토리지 오버 헤드 등을 무시합니다.


CJK 문자는 3 또는 4 바이트 시퀀스를 사용할 수 있습니다. dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor

8

이것은 좋지만 질문에 대답하지 않습니다.

"TINYTEXT 대신 항상 VARCHAR을 사용해야합니다." Tinytext는 행이 넓은 경우에 유용합니다. 데이터가 레코드에 저장되기 때문입니다. 성능 오버 헤드가 있지만 사용이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.