ขนาดสูงสุดของ MySQL VARCHAR คืออะไร?


300

ฉันต้องการทราบว่าขนาดสูงสุดสำหรับ MySQL VARCHAR ประเภทใด

ฉันอ่านว่าขนาดสูงสุดถูก จำกัด ด้วยขนาดแถวซึ่งประมาณ 65k ฉันพยายามตั้งค่าฟิลด์เป็นvarchar(20000)แต่มันบอกว่ามันใหญ่เกินไป

varchar(10000)ฉันสามารถตั้งค่าให้ จำนวนสูงสุดที่แน่นอนที่ฉันสามารถตั้งค่าคืออะไร?


1
รายละเอียดบล็อก: goo.gl/Hli6G3
Suresh Kamrushi

คำตอบ:


293

โปรดทราบว่า MySQL มีขีด จำกัด ขนาดแถวสูงสุด

การเป็นตัวแทนภายในของตาราง MySQL มีขีด จำกัด ขนาดแถวสูงสุด 65,535 ไบต์ไม่นับประเภท BLOB และ TEXT คอลัมน์ BLOB และ TEXT สนับสนุนเฉพาะ 9 ถึง 12 ไบต์ต่อขนาด จำกัด ของแถวเนื่องจากเนื้อหาจะถูกจัดเก็บแยกต่างหากจากส่วนที่เหลือของแถว อ่านเพิ่มเติมเกี่ยวกับข้อ จำกัดเกี่ยวกับจำนวนคอลัมน์ในคอลัมน์และขนาดแถว

ขนาดสูงสุดที่คอลัมน์เดียวสามารถครอบครองแตกต่างกันก่อนและหลัง MySQL 5.0.3

ค่าในคอลัมน์ VARCHAR เป็นสตริงที่มีความยาวผันแปรได้ ความยาวสามารถระบุเป็นค่าตั้งแต่ 0 ถึง 255 ก่อน MySQL 5.0.3 และ 0 ถึง65,535ใน 5.0.3 และรุ่นที่ใหม่กว่า ความยาวสูงสุดที่มีประสิทธิภาพของ VARCHAR ใน MySQL 5.0.3 และใหม่กว่านั้นขึ้นอยู่กับขนาดแถวสูงสุด (65,535 ไบต์ซึ่งแบ่งใช้ระหว่างคอลัมน์ทั้งหมด) และชุดอักขระที่ใช้

อย่างไรก็ตามโปรดทราบว่าขีด จำกัด ต่ำกว่าหากคุณใช้ชุดอักขระแบบหลายไบต์เช่น utf8 หรือ utf8mb4

ใช้TEXTประเภท inorder เพื่อเอาชนะขีด จำกัด ขนาดแถว

TEXT สี่ประเภทคือ TINYTEXT, TEXT, MEDIUMTEXT และ LONGTEXT สิ่งเหล่านี้สอดคล้องกับ BLOB สี่ประเภทและมีความยาวสูงสุดและข้อกำหนดการจัดเก็บเท่ากัน

รายละเอียดเพิ่มเติมเกี่ยวกับประเภท BLOB และ TEXT

มากไปกว่านั้น

ชำระเงินรายละเอียดเพิ่มเติมเกี่ยวกับข้อกำหนดการจัดเก็บข้อมูลประเภทข้อมูลที่เกี่ยวข้องกับข้อกำหนดการจัดเก็บข้อมูลสำหรับประเภทข้อมูลทั้งหมด


4
สตริง "ยาว" คืออะไร
Richard H

6
ฉันพยายามหลีกเลี่ยงคอลัมน์ TEXT แม้ว่าจะทำให้ตารางอุณหภูมิถูกสร้างขึ้นเมื่อมีการเรียงลำดับ
Robert Swisher

1
ถ้าฉันใช้ varchar (200) สำหรับชื่อแรกและฉันเก็บไว้เพียง 6 อักขระในฟิลด์นี้ดังนั้นชื่อแรกของไบต์จะมีจำนวนเท่าใด
Paresh Gami

2
@PareshGami - 6 + 1 = 7 ตัวอักษร! ตรงกันข้ามกับ CHAR ค่า VARCHAR จะถูกจัดเก็บเป็นส่วนนำหน้าความยาว 1 ไบต์หรือ 2 ไบต์บวกกับข้อมูล ขึ้น ...
rajukoyilandy

58

ตามเอกสารออนไลน์มีการ จำกัด แถว 64K และคุณสามารถคำนวณขนาดของแถวได้โดยใช้:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

คุณต้องจำไว้ว่าความยาวของคอลัมน์ไม่ใช่การแมปแบบหนึ่งต่อหนึ่งของขนาด ตัวอย่างเช่นCHAR(10) CHARACTER SET utf8ต้องการสามไบต์สำหรับแต่ละอักขระสิบตัวเนื่องจากการเข้ารหัสนั้นต้องคำนึงถึงคุณสมบัติสามไบต์ต่ออักขระของutf8(นั่นคือการutf8เข้ารหัสของ MySQLมากกว่า UTF-8 "ของจริง" ซึ่งสามารถมีได้ถึงสี่ไบต์ )

แต่ถ้าขนาดแถวของคุณใกล้ถึง 64K คุณอาจต้องการตรวจสอบสคีมาของฐานข้อมูลของคุณ เป็นตารางที่หายากที่ต้องมีความกว้างในฐานข้อมูลที่ตั้งค่าอย่างถูกต้อง (3NF) - เป็นไปได้ไม่ธรรมดามาก

หากคุณต้องการใช้มากกว่านั้นคุณสามารถใช้BLOBหรือTEXTประเภท สิ่งเหล่านี้จะไม่นับรวมกับขีด จำกัด 64K ของแถว (นอกเหนือจากการดูแลระบบขนาดเล็ก) แต่คุณต้องระวังปัญหาอื่น ๆ ที่มาจากการใช้งานของพวกเขาเช่นไม่สามารถเรียงลำดับโดยใช้บล็อกข้อความทั้งหมดเกินจำนวนที่กำหนด ของตัวละคร (แม้ว่าจะสามารถกำหนดค่านี้ขึ้นไป) บังคับให้ตารางชั่วคราวอยู่บนดิสก์มากกว่าในหน่วยความจำหรือต้องกำหนดค่าไคลเอนต์และเซิร์ฟเวอร์ comms บัฟเฟอร์เพื่อจัดการขนาดอย่างมีประสิทธิภาพ

ขนาดที่ได้รับอนุญาตคือ:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

คุณยังคงมีไม่ตรงกันไบต์ / ตัวอักษร (เพื่อให้MEDIUMTEXT utf8คอลัมน์สามารถเก็บ "เพียง" ประมาณครึ่งล้านตัวอักษร(16M-1)/3 = 5,592,405) แต่ก็ยังขยายช่วงของคุณอย่างมาก


4
โปรดทราบว่าประเภทข้อความไม่สามารถเก็บไว้ในตารางหน่วยความจำได้ดังนั้นจึงมีการปรับประสิทธิภาพที่สำคัญสำหรับการใช้งานเมื่อ VARCHAR เพียงพอ
Camden S.

'คุณสมบัติสามไบต์ต่ออักขระของ utf8' ของMySql utf8ซึ่งไม่ได้เป็น utf8 เลย ในความเป็นจริงสูงสุด ไบต์ใน UTF-8 ถ่านเป็น4 ด้วยเหตุนี้คุณควรตั้งค่าการเข้ารหัสutf8mb4ใน MySQLเสมอ utf8mb4คือชื่อของ MySql สำหรับสิ่งที่เหลือของคำที่เรียกว่า utf8
Stijn de Witt

1
@ StijndeWitt ขอบคุณสำหรับสิ่งนั้น ชี้แจงว่าฉันหมายถึงวิธีการเข้ารหัส utf8 ของ MySQL มากกว่า UTF-8 โดยทั่วไปฉันใช้ตัวแปรตัวพิมพ์ใหญ่เพื่อระบุ UTF-8 "ของจริง" เนื่องจากเป็นแบบแผนของ IANA ที่ยอมรับ
paxdiablo

41

แหล่ง

ความยาวสูงสุดของ varchar ขึ้นอยู่กับขนาดแถวสูงสุดใน MySQL ซึ่งเป็น 64KB (ไม่นับ BLOB):

VARCHAR (65535) อย่างไรก็ตามโปรดทราบว่าขีด จำกัด ต่ำกว่าหากคุณใช้ชุดอักขระแบบหลายไบต์:

VARCHAR (21844) ชุดอักขระ UTF8


20
โปรดหยุดใช้CHARACTER SET utf8ในตัวอย่าง ควรเป็นCHARACTER SET utf8mb4(ถ้าคุณต้องการเก็บข้อความ Unicode ทั้งหมดอย่างถูกต้อง ... และใครไม่ต้องการนั่น)
Stijn de Witt

4
สำหรับการใช้งานCHARSET=utf8mb4 VARCHAR(16383)
Wil Moore III

3
การใช้ utf8mb4 จะทำให้คุณไม่สามารถจำกัดความกว้างของดัชนีในสถานการณ์ที่ utf8 ไม่ได้ หากคุณตรวจสอบชุดอักขระที่รวมอยู่ใน utf8mb4 แต่ไม่รวมอยู่ใน utf8 คุณอาจพบว่าการรวมรูปแบบของอักษรอียิปต์โบราณและชุดอักขระอาร์เคนอื่น ๆ ทั้งหมดนั้นไม่คุ้มค่ากับการลงโทษอย่างมีนัยสำคัญ (พิจารณาจากประจักษ์) มันค่อนข้างไม่แห้งและแห้งเหมือนที่ Stijn บอกเป็นนัย
kcrossen

อิโมจิจำนวนมากมีอยู่ใน utf8mb4 และหายไปจาก utf8 ดังนั้นอาจเปลี่ยนสมการว่าคุ้มค่าหรือไม่
Brian Morearty

23

จากเอกสาร MySQL:

ความยาวสูงสุดที่มีประสิทธิภาพของ VARCHAR ใน MySQL 5.0.3 และใหม่กว่านั้นขึ้นอยู่กับขนาดแถวสูงสุด (65,535 ไบต์ซึ่งแบ่งใช้ระหว่างคอลัมน์ทั้งหมด) และชุดอักขระที่ใช้ ตัวอย่างเช่นอักขระ utf8 สามารถต้องการได้สูงสุดสามไบต์ต่ออักขระดังนั้นคอลัมน์ VARCHAR ที่ใช้ชุดอักขระ utf8 สามารถประกาศได้สูงสุด 21,844 อักขระ

ข้อ จำกัด สำหรับ VARCHAR นั้นแตกต่างกันไปตามชุดอักขระที่ใช้ การใช้ ASCII จะใช้ 1 ไบต์ต่อตัวอักษร หมายความว่าคุณสามารถเก็บ 65,535 ตัวอักษร การใช้ utf8 จะใช้ 3 ไบต์ต่อตัวละครทำให้เกิดข้อ จำกัด อักขระที่ 21,844 แต่ถ้าคุณกำลังใช้ charset multibyte ที่ทันสมัย ​​utf8mb4 ซึ่งคุณควรใช้! รองรับอิโมจิและตัวละครพิเศษอื่น ๆ มันจะใช้ 4 ไบต์ต่อตัวละคร การทำเช่นนี้จะ จำกัด จำนวนอักขระต่อตารางไว้ที่ 16,383 โปรดทราบว่าฟิลด์อื่นเช่น INT จะถูกนับเป็นขีด จำกัด เหล่านี้

สรุป:

utf8สูงสุด21,844ตัวอักษร

utf8mb4สูงสุด16,383ตัวอักษร


6

คุณยังสามารถใช้ MEDIUMBLOB / LONGBLOB หรือ MEDIUMTEXT / LONGTEXT

ชนิด BLOB ใน MySQL สามารถจัดเก็บได้มากถึง 65,534 ไบต์หากคุณพยายามจัดเก็บข้อมูลมากกว่านี้ MySQL จะตัดทอนข้อมูล MEDIUMBLOB สามารถเก็บได้มากถึง 16,777,213 ไบต์และ LONGBLOB สามารถเก็บได้สูงสุด 4,294,967,292 ไบต์


3

ก่อนที่ Mysql รุ่น 5.0.3 ประเภทข้อมูล Varchar สามารถเก็บ 255 ตัวอักษร แต่จาก 5.0.3 มันสามารถเก็บ 65,535 ตัวอักษร

แต่มีข้อ จำกัด ของขนาดแถวสูงสุด 65,535 ไบต์ หมายความว่าการรวมคอลัมน์ทั้งหมดจะต้องไม่เกิน 65,535 ไบต์

ในกรณีของคุณอาจเป็นไปได้ว่าเมื่อคุณพยายามที่จะตั้งมากกว่า 10,000 มันเกินกว่า 65,535 และ mysql จะให้ข้อผิดพลาด

สำหรับข้อมูลเพิ่มเติม: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

บล็อกพร้อมตัวอย่าง: http://goo.gl/Hli6G3


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