Kích thước lưu trữ tối đa TINYTEXT, TEXT, MEDIUMTEXT và LONGTEXT


796

Theo các tài liệu MySQL , có bốn loại văn bản:

  1. TINYTEXT
  2. BẢN VĂN
  3. TRUNG TÂM
  4. VĂN BẢN DÀI

Độ dài tối đa mà tôi có thể lưu trữ trong một cột của mỗi loại dữ liệu giả sử mã hóa ký tự là UTF-8 là bao nhiêu?


26
Lấy ví dụ kiểu văn bản. Nó có thể chứa 65535 byte dữ liệu. UTF-8 chứa các ký tự nhiều byte. Do đó, nếu bạn điền vào trường chỉ sử dụng ký tự Đan Mạch "", bạn sẽ chỉ nhận được 32767 ký tự, vì ký tự UTF-8 đó bao gồm hai byte. Nếu bạn điền nó bằng "a", bạn sẽ nhận được 65535 ký tự.
Andrew Plank

Câu trả lời:


1518

Từ tài liệu :

      Loại | Chiều dài tối đa
----------- + -------------------------------------
  TINYTEXT | 255 (2 8 1) byte
      VĂN BẢN | 65,535 (2 16 1) byte = 64 KiB
TRUNG TÂM | 16,777,215 (2 24 1) byte = 16 MiB
  LONGTEXT | 4.294.967.295 (2 32 1) byte = 4 GiB

Lưu ý rằng số lượng ký tự có thể được lưu trữ trong cột của bạn sẽ phụ thuộc vào mã hóa ký tự .


3
@Bridge Không chắc tôi hiểu, nhưng điều này có nghĩa là TINYTEXT có thể nhận được tối đa 255 ký tự, tôi có đúng không ???
ltdev

9
@Lykos Vâng, tốt - tùy thuộc vào các nhân vật. Từ tài liệu: 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.Xem câu trả lời của Ankan để biết thêm chi tiết.
Cầu

4
@ aurel.g Đây là cách bạn thực sự trả lời câu hỏi. Và tôi đồng ý với Barshe, đây là cách myQuery nên trình bày các tham số của nó - ngay cả khi chỉ là một tốc ký bổ sung cho ... chế độ xem văn bản phức tạp của chúng.
cbmtrx

1
Có thể đáng để thêm rằng thứ tự cường độ của một ký tự là một vài byte (giả sử tối thiểu 1 tôi cho là). Vì vậy, người ta có thể lưu trữ 10.000-50.000 ký tự trong một cột văn bản, ...
Vince

30
Tại sao khó tìm thấy điều này trong các tài liệu hơn là trong stackoverflow
Boris D. Teoharov

245

Mở rộng cùng một câu trả lời

  1. Bài viết SO này phác thảo chi tiết các chi phí chung và cơ chế lưu trữ.
  2. Như đã lưu ý từ điểm (1), VARCHAR phải luôn được sử dụng thay vì TINYTEXT. Tuy nhiên, khi sử dụng VARCHAR, kích thước hàng tối đa không nên vượt quá 65535 byte.
  3. Như được phác thảo ở đây http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , tối đa 3 byte cho utf-8.

ĐÂY LÀ BẢNG DỰ ÁN ROUGH CHO CÁC QUYẾT ĐỊNH NHANH CHÓNG!

  1. Vì vậy, các giả định trường hợp xấu nhất (3 byte mỗi utf-8 char) cho trường hợp tốt nhất (1 byte mỗi utf-8 char)
  2. Giả sử ngôn ngữ tiếng Anh có trung bình 4,5 chữ cái mỗi từ
  3. x là số byte được phân bổ

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

Vui lòng tham khảo câu trả lời của Chris V: https://stackoverflow.com/a/35785869/1881812


4
Lý do cho "VARCHAR này phải luôn được sử dụng thay vì TINYTEXT" là gì? Đôi khi sẽ tốt hơn (vì hiệu quả lưu trữ hơn) khi sử dụng TINYTEXT nhỏ hơn?
vlasits

24
@vlasits đọc bài SO bao gồm để biết chi tiết. (1) tất cả các loại văn bản, bao gồm cả tinytext được lưu trữ dưới dạng các đối tượng bên ngoài hàng là một chi phí (2) Các đối tượng này sau đó được tham chiếu bởi các địa chỉ 8 hoặc 16 byte. do đó, cho dù tinytext của bạn nhỏ đến mức nào, bạn cũng đang thêm các chi phí không cần thiết, với kích thước tối đa 255 byte. Rõ ràng là varchar nên được sử dụng, mà sẽ không có bất kỳ chi phí nào ở trên.
Ankan-Zerob

4
@ Ankan-Zerob Cho rằng có vẻ như rất rõ ràng rằng TINYTEXT không bao giờ nên được sử dụng trên VARCHAR, lý do nào để thậm chí có nó như là một tùy chọn? Có một số trường hợp sử dụng tối nghĩa khi cần thiết?
nextgentech

4
@nextgentech Hãy xem dev.mysql.com/doc/refman/5.0/en/column-count-limit.html . Kích thước bản ghi được giới hạn ở 64 KiB. Một bảng được giới hạn trong 4k cột. A TINYTEXTđếm 1 byte + 8 byte so với kích thước bản ghi, trong khi đó VARCHAR(255)đếm từ 1 byte + 255 byte đến 2 byte + 1020 byte (4 byte ký tự UTF-8) so với kích thước bản ghi.
Shi

2
Tôi thích thể hiện kích thước trường bằng từ, nhưng ... Tiếng Anh thường được coi là có khoảng 5 ký tự cho mỗi từ và cũng có một ký tự khoảng trắng được lưu trữ; tuy nhiên, tiếng Anh sẽ luôn ở mức gần 1 byte cho mỗi ký tự UTF-8, vì vậy tôi sẽ chia cho 6 khoảng 40 / 10.000 / 2.700.000 / 710.000.000 từ cho các kích cỡ khác nhau. Các ngôn ngữ có nhiều dấu như tiếng Ba Lan sẽ có ít từ hơn một chút; Tiếng Hy Lạp, tiếng Do Thái, tiếng Ả Rập, v.v (với hầu hết các chuỗi 2 byte) khoảng một nửa; Các chữ tượng hình của CJK là các chuỗi 3 hoặc 4 byte, nhưng tôi không biết các từ đó dài bao nhiêu.
ChrisV

44

Vượt lên thách thức của @ Ankan-Zerob, đây là ước tính của tôi về độ dài tối đa có thể được lưu trữ trong mỗi loại văn bản được đo bằng từ :

      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

Trong tiếng Anh , 4,8 chữ cái trên mỗi từ có thể là mức trung bình tốt (ví dụ norvig.com/mayzner.html ), mặc dù độ dài từ sẽ thay đổi tùy theo tên miền (ví dụ: ngôn ngữ nói so với giấy tờ học thuật), vì vậy không có điểm nào quá chính xác. Tiếng Anh chủ yếu là các ký tự ASCII byte đơn, với các ký tự nhiều byte rất thường xuyên, rất gần với một byte mỗi chữ cái. Một ký tự phụ phải được phép cho các khoảng trắng giữa các từ, vì vậy tôi đã làm tròn xuống từ 5,8 byte mỗi từ. Các ngôn ngữ có nhiều dấu như tiếng Ba Lan sẽ lưu trữ ít từ hơn một chút, ví dụ như tiếng Đức có từ dài hơn.

Các ngôn ngữ yêu cầu các ký tự nhiều byte như tiếng Hy Lạp, tiếng Ả Rập, tiếng Do Thái, tiếng Hindi, tiếng Thái, v.v. thường yêu cầu hai byte cho mỗi ký tự trong UTF-8. Đoán 5 ký tự mỗi từ, tôi đã làm tròn từ 11 byte mỗi từ.

Kịch bản CJK (Hanzi, Kanji, Hiragana, Katakana, v.v.) Tôi không biết gì về; Tôi tin rằng các ký tự chủ yếu yêu cầu 3 byte trong UTF-8 và (với sự đơn giản hóa lớn) chúng có thể được coi là sử dụng khoảng 2 ký tự cho mỗi từ, vì vậy chúng sẽ ở đâu đó giữa hai ký tự kia. (Các tập lệnh CJK có thể yêu cầu lưu trữ ít hơn bằng UTF-16, tùy thuộc).

Điều này là tất nhiên bỏ qua chi phí lưu trữ, vv


Các ký tự CJK có thể sử dụng chuỗi 3 hoặc 4 byte: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor

8

Điều này là tốt nhưng không trả lời câu hỏi:

"VARCHAR phải luôn được sử dụng thay vì TINYTEXT." Tinytext rất hữu ích nếu bạn có hàng rộng - vì dữ liệu được lưu ngoài bản ghi. Có một chi phí hiệu năng, nhưng nó có sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.