Độ dài tối đa cho văn bản loại MySQL


437

Tôi đang tạo một biểu mẫu để gửi tin nhắn riêng tư và muốn đặt maxlengthgiá trị của một vùng văn bản phù hợp với độ dài tối đa của một texttrường trong bảng cơ sở dữ liệu MySQL của tôi. Có bao nhiêu ký tự có thể lưu trữ trường văn bản?

Nếu nhiều, tôi có thể chỉ định độ dài trong trường loại văn bản cơ sở dữ liệu như với varchar không?


5
Gõ 64k vào trường văn bản đơn giản? đau đớn ...
Marc B

169
@Marc B Không bao giờ đánh giá thấp khả năng của người dùng để dán một lượng lớn rác vào trường tin nhắn văn bản riêng tư.
simontemplar

5
Và đó là lý do tại sao bạn nên hạn chế dung lượng trường văn bản và luôn xác thực đầu vào của mình ...
jpangamarca

Câu trả lời:


750

Xem để biết số lượng tối đa: http://dev.mysql.com/doc/refman/5.0/en/st Storage-request.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 là số byte trong trường văn bản của bạn. Vì vậy, số ký tự tối đa cho văn bản là 2 16 -1 (sử dụng các ký tự một byte). Có nghĩa là 65 535 ký tự (sử dụng các ký tự một byte).

Mã hóa UTF-8 / MultiByte : sử dụng mã hóa MultiByte mỗi ký tự có thể tiêu tốn hơn 1 byte dung lượng. Đối với mức tiêu thụ không gian UTF-8 là từ 1 đến 4 byte mỗi char.


2
@ fyr- Ở đây có nghĩa là gì đối với L + 2 byte, trong đó L <2 ^ 16? Bạn có thể vui lòng xác định nó một chút nữa không? Thông thái khác bạn có thể cho tôi biết có bao nhiêu ký tự chúng ta có thể lưu trữ trong trường văn bản? Xin vui lòng ....
Bajrang

2
@JJ L là số lượng ký tự và số lượng ký tự cần ít hơn 2 đến lũy thừa 16. 2 ^ 16 = 65536. Vì vậy, bạn có thể nhập 65535 ký tự tiêu thụ 65535 byte + 3 byte = 65 538 byte mỗi lần Cánh đồng đầy.
fyr

9
Lưu ý rằng giới hạn kích thước được tính bằng byte . Vì vậy, nếu bạn sử dụng các ký tự nhiều byte, bạn không nhận được 2 ^ 16 ký tự trong một cột văn bản, bạn sẽ nhận được nhiều ký tự bạn có thể lưu trữ trong 2 ^ 16 byte.
Bill Karwin

4
Những gì Bill Karwin nói. BYTES, KHÔNG ĐẶC ĐIỂM. Một ký tự có thể sử dụng 4 byte để lưu trữ với mã hóa đã cho (như 💩 trong UTF-8).
bản6

8
Lưu ý rằng trong MySQL, utf8 tiêu thụ tối đa 3 byte, utf8mb4 tiêu thụ tới 4. tham chiếu
mpen

126

TINYTEXT: 256 byte
VĂN BẢN:
65,535 byte MEDIUMTEXT: 16,777,215 byte
LONGTEXT: 4,294,967,295 byte


10
Tôi nghĩ TINYTEXT nên là 255 byte thay vì 256 byte, theo câu trả lời được chấp nhận?
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

Lưu ý: Nếu sử dụng các ký tự đa ô (như tiếng Ả Rập, trong đó mỗi ký tự tiếng Ả Rập chiếm 2 byte), cột "Chính xác độ dài tối đa được phép" TINYTEXTcó thể chứa tối đa 127 ký tự tiếng Ả Rập (Lưu ý: dấu cách, dấu gạch ngang, dấu gạch dưới và các ký tự khác , là các ký tự 1 byte).

Về cơ bản, nó giống như:

"Độ dài chính xác tối đa được phép" = "Độ dài xấp xỉ" tính bằng byte - 1


18

Theo http://dev.mysql.com/doc/refman/5.0/en/st Storage-request.html , giới hạn là L + 2 bytes, where L < 2^16, hoặc 64k.

Bạn không cần phải lo lắng về việc giới hạn nó, nó sẽ tự động được chia thành các phần được thêm vào khi chuỗi phát triển, vì vậy nó sẽ không luôn luôn sử dụng 64k một cách mù quáng.


8

Có bao nhiêu ký tự có thể lưu trữ trường văn bản?

Theo Tài liệu Bạn có thể sử dụng tối đa 21.844 ký tự nếu bộ ký tự là UTF8

Nếu nhiều, tôi có thể chỉ định độ dài trong trường loại văn bản db như với varchar không?

Bạn không cần chỉ định chiều dài. Nếu bạn cần thêm ký tự, hãy sử dụng các kiểu dữ liệu MEDIUMTEXT hoặc LONGTEXT. Với VARCHAR, độ dài cụ thể không dành cho yêu cầu Lưu trữ, nó chỉ dành cho cách lấy dữ liệu từ cơ sở dữ liệu.


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

TINYTEXTlà một kiểu dữ liệu chuỗi có thể lưu trữ tối đa các 255ký tự.

TEXTlà một kiểu dữ liệu chuỗi có thể lưu trữ tối đa các 65,535ký tự. TEXTthường được sử dụng cho các bài viết ngắn gọn.

LONGTEXTlà kiểu dữ liệu chuỗi có độ dài 4,294,967,295ký tự tối đa . Sử dụng LONGTEXTnếu bạn cần lưu trữ văn bản lớn, chẳng hạn như một chương của một cuốn tiểu thuyết.


1

TEXTlà kiểu dữ liệu chuỗi có thể lưu trữ tối đa 65.535 ký tự. Nhưng nếu bạn muốn lưu trữ nhiều dữ liệu hơn thì hãy thay đổi kiểu dữ liệu của nó thànhLONGTEXT

ALTER TABLE name_tabelĐỔI text_fieldLONGTEXT CHARACTER SET utf8đối chiếu utf8_general_ciNOT NULL;


1

Đối với phiên bản MySql 8.0.

Yêu cầu lưu trữ kiểu số

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

Các giá trị cho các cột DECIMAL (và NUMERIC) được biểu diễn bằng định dạng nhị phân bao gồm chín chữ số thập phân (cơ sở 10) thành bốn byte. Lưu trữ cho các phần nguyên và phần của mỗi giá trị được xác định riêng. Mỗi bội số của chín chữ số yêu cầu bốn byte và các chữ số còn lại của kiểu chữ cái còn lại yêu cầu một số phần của bốn byte. Việc lưu trữ cần thiết cho các chữ số thừa được đưa ra bởi bảng sau.

Yêu cầu lưu trữ loại ngày và thời gian đối với các cột TIME, DATETIME và TIMESTAMP, lưu trữ cần thiết cho các bảng được tạo trước khi MySQL 5.6.4 khác với các bảng được tạo từ 5.6.4 trở đi. Điều này là do sự thay đổi trong 5.6.4 cho phép các loại này có một phần phân đoạn, yêu cầu từ 0 đến 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

Kể từ MySQL 5.6.4, dung lượng lưu trữ cho NĂM và NGÀY không thay đổi. Tuy nhiên, TIME, DATETIME và TIMESTAMP được thể hiện khác nhau. DATETIME được đóng gói hiệu quả hơn, yêu cầu 5 chứ không phải 8 byte cho phần không chiết xuất và cả ba phần đều có phần phân đoạn yêu cầu từ 0 đến 3 byte, tùy thuộc vào độ chính xác giây của các giá trị được lưu trữ.

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

Ví dụ: TIME (0), TIME (2), TIME (4) và TIME (6) lần lượt sử dụng 3, 4, 5 và 6 byte. TIME và TIME (0) là tương đương và yêu cầu lưu trữ giống nhau.

Để biết chi tiết về biểu diễn bên trong của các giá trị tạm thời, hãy xem Nội bộ MySQL: Các thuật toán và cấu trúc quan trọng.

Yêu cầu lưu trữ kiểu chuỗi Trong bảng sau, M biểu thị độ dài cột được khai báo bằng ký tự cho loại chuỗi không nhị phân và byte cho loại chuỗi nhị phân. L đại diện cho độ dài thực tế tính bằng byte của một giá trị chuỗi đã cho.

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)
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.