ความยาวสูงสุดสำหรับข้อความประเภท MySQL


437

ฉันกำลังสร้างฟอร์มสำหรับการส่งข้อความส่วนตัวและต้องการกำหนดmaxlengthค่าของ textarea ที่เหมาะสมกับความยาวสูงสุดของtextฟิลด์ในตารางฐานข้อมูล MySQL ของฉัน สามารถจัดเก็บฟิลด์ข้อความชนิดอักขระได้กี่ตัว

ถ้ามากฉันจะสามารถระบุความยาวในฟิลด์ประเภทข้อความฐานข้อมูลเช่นเดียวกับ varchar หรือไม่


5
พิมพ์ 64k ลงในฟิลด์ข้อความธรรมดาหรือไม่? เจ็บปวด ...
Marc B

169
@Marc B อย่าประมาทความสามารถของผู้ใช้ในการวางขยะจำนวนมากลงในช่องข้อความส่วนตัว
simontemplar

5
และนั่นคือเหตุผลที่คุณควร จำกัด กำลังการผลิต TextField และมักจะตรวจสอบปัจจัยการผลิตของคุณ ...
jpangamarca

คำตอบ:


750

ดูหมายเลขสูงสุดได้ที่: http://dev.mysql.com/doc/refman/5.0/th/storage-requirements.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 คือจำนวนไบต์ในฟิลด์ข้อความของคุณ ดังนั้นจำนวนสูงสุดของตัวอักษรสำหรับข้อความคือ 2 16 -1 (ใช้อักขระไบต์เดียว) หมายถึง 65 535 ตัวอักษร (ใช้อักขระไบต์เดียว)

การเข้ารหัส UTF-8 / MultiByte : การใช้การเข้ารหัส MultiByte แต่ละอักขระอาจใช้เนื้อที่มากกว่า 1 ไบต์ สำหรับการใช้พื้นที่ UTF-8 อยู่ระหว่าง 1 ถึง 4 ไบต์ต่ออักขระ


2
@ fyr- นี่คือความหมายสำหรับ L + 2 ไบต์ที่ L <2 ^ 16 คืออะไร? คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม? ฉลาดอื่น ๆ ที่คุณสามารถบอกฉันว่ากี่ตัวอักษรที่เราสามารถเก็บไว้ในช่องข้อความ? ได้โปรด ....
Bajrang

2
@JJ L คือจำนวนตัวอักษรและจำนวนตัวอักษรต้องน้อยกว่า 2 ถึงกำลังของ 16 2 ^ 16 = 65536 ดังนั้นคุณอาจป้อน 65535 ตัวอักษรที่กิน 65535 ไบต์ + 3 ไบต์ = 65 538 ไบต์ต่อเต็ม ฟิลด์ที่กรอกข้อมูล
fyr

9
โปรดทราบว่าขีด จำกัด ของขนาดอยู่ในไบต์ ดังนั้นหากคุณใช้อักขระแบบหลายไบต์คุณจะไม่ได้รับอักขระ 2 ^ 16 ตัวในคอลัมน์ TEXT คุณจะได้รับอักขระจำนวนมาก แต่คุณสามารถเก็บได้ใน 2 ^ 16 ไบต์
Bill Karwin

4
สิ่งที่ Bill Karwin พูด BYTES ไม่ใช่ตัวละคร อักขระอาจใช้ 4 ไบต์เพื่อจัดเก็บด้วยการเข้ารหัสที่กำหนด (เช่น💩ใน UTF-8)
พื้นฐาน 6

8
โปรดทราบว่าใน MySQL, utf8 กินได้ถึง 3 ไบต์, utf8mb4 กินได้ถึง 4 อ้างอิง
mpen

126

TINYTEXT: 256 ไบต์
TEXT: 65,535 ไบต์
MEDIUMTEXT: 16,777,215 ไบต์
LONGTEXT: 4,294,967,295 ไบต์


10
ฉันคิดว่า TINYTEXT ควรเป็น 255 ไบต์แทนที่จะเป็น 256 ไบต์ตามคำตอบที่ยอมรับหรือไม่
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

หมายเหตุ:หากใช้อักขระหลายไบต์ (เช่นอาราบิกโดยที่อักขระอารบิกแต่ละตัวใช้เวลา 2 ไบต์) คอลัมน์ "Exact Max. Length ที่อนุญาตสูงสุด" สำหรับTINYTEXTสามารถเก็บได้สูงสุด 127 อักขระอารบิก (หมายเหตุ: เว้นวรรคขีดเส้นใต้และอักขระอื่น ๆ , คืออักขระ 1 ไบต์)

โดยทั่วไปมันเป็นเช่น:

"Exact Max. Length ที่อนุญาต" = "ความยาวโดยประมาณ" ในหน่วยไบต์ - 1


18

อ้างอิงถึงhttp://dev.mysql.com/doc/refman/5.0/en/storage-requirements.htmlขีด จำกัด คือL + 2 bytes, where L < 2^16หรือ 64k

คุณไม่จำเป็นต้องกังวลเกี่ยวกับการ จำกัด มันจะถูกแบ่งออกเป็นชิ้น ๆ โดยอัตโนมัติเมื่อมีการเติบโตของสตริงดังนั้นมันจะไม่ใช้ 64k แบบสุ่มเสมอไป


8

สามารถจัดเก็บฟิลด์ข้อความชนิดอักขระได้กี่ตัว

ตามเอกสารคุณสามารถใช้อักขระได้สูงสุด 21,844 ตัวอักษรถ้าชุดอักขระเป็น UTF8

ถ้ามีมากฉันจะสามารถระบุความยาวในฟิลด์ประเภทข้อความ db ได้เช่นเดียวกับ varchar หรือไม่?

คุณไม่จำเป็นต้องระบุความยาว หากคุณต้องการใช้ตัวอักษรเพิ่มเติมชนิดข้อมูล MEDIUMTEXT หรือ LONGTEXT ด้วย VARCHAR ความยาวที่เฉพาะเจาะจงไม่ได้มีไว้สำหรับความต้องการในการจัดเก็บมันเป็นเพียงสำหรับวิธีการดึงข้อมูลจากฐานข้อมูล


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

TINYTEXTเป็นชนิดข้อมูลสตริงที่สามารถจัดเก็บ255อักขระได้สูงสุดตัว

TEXTเป็นชนิดข้อมูลสตริงที่สามารถเก็บ65,535อักขระได้สูงสุดตัว TEXTมักใช้สำหรับบทความสั้น ๆ

LONGTEXTเป็นชนิดข้อมูลสตริงที่มีความยาว4,294,967,295อักขระสูงสุด ใช้LONGTEXTหากคุณต้องการเก็บข้อความขนาดใหญ่เช่นบทของนวนิยาย


1

TEXTเป็นชนิดข้อมูลสตริงที่สามารถเก็บได้สูงสุด 65,535 อักขระ แต่ถ้าคุณต้องการเก็บข้อมูลเพิ่มเติมให้เปลี่ยนประเภทข้อมูลเป็นLONGTEXT

เปลี่ยนแปลงตารางname_tabelเปลี่ยนtext_fieldLONGTEXT ชุดอักขระutf8เรียงutf8_general_ciไม่เป็นโมฆะ;


1

สำหรับ MySql เวอร์ชั่น 8.0

ข้อกำหนดการจัดเก็บประเภทตัวเลข

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

ค่าสำหรับคอลัมน์ DECIMAL (และ NUMERIC) จะแสดงโดยใช้รูปแบบไบนารีที่แพ็คตัวเลขฐานสิบเก้า (ฐาน 10) เป็นสี่ไบต์ การจัดเก็บข้อมูลสำหรับชิ้นส่วนจำนวนเต็มและเศษส่วนของแต่ละค่าจะถูกกำหนดแยกต่างหาก แต่ละตัวของเก้าหลักต้องการสี่ไบต์และหลัก "ที่เหลือ" ต้องการเศษของสี่ไบต์ การจัดเก็บข้อมูลที่จำเป็นสำหรับตัวเลขเกินจะได้รับจากตารางต่อไปนี้

ข้อกำหนดในการจัดเก็บประเภทวันที่และเวลาสำหรับคอลัมน์ TIME, DATETIME และ TIMESTAMP ซึ่งเป็นพื้นที่จัดเก็บข้อมูลที่จำเป็นสำหรับตารางที่สร้างขึ้นก่อน MySQL 5.6.4 แตกต่างจากตารางที่สร้างจาก 5.6.4 on นี่คือสาเหตุที่การเปลี่ยนแปลงใน 5.6.4 ที่อนุญาตให้ชนิดเหล่านี้มีส่วนที่เป็นเศษส่วนซึ่งต้องการจาก 0 ถึง 3 ไบต์

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

ในฐานะของ MySQL 5.6.4 การจัดเก็บข้อมูลสำหรับปีและวันที่ยังคงไม่เปลี่ยนแปลง อย่างไรก็ตาม TIME, DATETIME และ TIMESTAMP จะแสดงต่างกัน DATETIME บรรจุอย่างมีประสิทธิภาพมากขึ้นโดยต้องการ 5 แทนที่จะเป็น 8 ไบต์สำหรับส่วนที่ไม่ใช่เศษส่วนและทั้งสามส่วนมีส่วนที่เป็นเศษส่วนที่ต้องการตั้งแต่ 0 ถึง 3 ไบต์ขึ้นอยู่กับความแม่นยำของเศษส่วนวินาทีของค่าที่เก็บไว้

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

ตัวอย่างเช่น TIME (0), TIME (2), TIME (4) และ TIME (6) ใช้ 3, 4, 5 และ 6 ไบต์ตามลำดับ TIME และ TIME (0) เทียบเท่าและต้องการพื้นที่เก็บข้อมูลเดียวกัน

สำหรับรายละเอียดเกี่ยวกับการเป็นตัวแทนภายในของค่าชั่วคราวโปรดดู MySQL Internals: อัลกอริทึมและโครงสร้างที่สำคัญ

ความต้องการที่เก็บข้อมูลประเภทสตริงในตารางต่อไปนี้ M แสดงถึงความยาวคอลัมน์ที่ประกาศเป็นอักขระสำหรับชนิดสตริงที่ไม่ใช่ไบนารีและไบต์สำหรับชนิดสตริงไบนารี L หมายถึงความยาวจริงในหน่วยไบต์ของค่าสตริงที่กำหนด

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.