เทียบเท่า varchar (สูงสุด) ใน MySQL?


คำตอบ:


195

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

VARCHAR(65535)

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

VARCHAR(21844) CHARACTER SET utf8

นี่คือตัวอย่างบางส่วน:

ขนาดแถวสูงสุดคือ 65535 แต่ varchar ยังรวมไบต์หรือสองเพื่อเข้ารหัสความยาวของสตริงที่กำหนด ดังนั้นคุณไม่สามารถประกาศค่า varchar ของขนาดแถวสูงสุดได้แม้ว่าจะเป็นคอลัมน์เดียวในตาราง

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

แต่ถ้าเราลองลดความยาวลงเราจะพบความยาวที่สุดที่ใช้ได้:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

ตอนนี้ถ้าเราพยายามใช้ชุดอักขระหลายไบต์ที่ระดับตารางเราจะพบว่ามันนับจำนวนอักขระแต่ละตัวเป็นหลายไบต์ สตริง UTF8 ไม่จำเป็นต้องใช้หลายไบต์ต่อสตริง แต่ MySQL ไม่สามารถสรุปได้ว่าคุณจะ จำกัด การแทรกในอนาคตของคุณทั้งหมดให้เป็นอักขระไบต์เดียว

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

แม้จะมีข้อผิดพลาดล่าสุดบอกเราว่า InnoDB ยังคงไม่ชอบความยาว 21845

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

นี่เหมาะสมอย่างยิ่งหากคุณคำนวณว่า 21845 * 3 = 65535 ซึ่งจะไม่ได้ผล โดยที่ 21844 * 3 = 65532 ซึ่งทำงานได้

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)

20
ฉันขอแนะนำให้ใช้ TEXT
Adi

2
@AdnanShammout: แน่นอนยกเว้นว่าคุณต้องการประกาศDEFAULTค่าสำหรับคอลัมน์ ไม่สามารถทำได้ด้วยประเภท TEXT หรือ BLOB
Bill Karwin

5
@DanW TEXTจำกัดความยาวไม่เกิน 64K MEDIUMTEXTจำกัดความยาวไม่เกิน 16M LONGTEXTความยาวสูงสุดคือ 4G
Bill Karwin

4
ปัญหาที่ใหญ่ที่สุดของสิ่งนี้คือถ้าคุณสร้างคอลัมน์ที่มีขนาดนั้นคุณสามารถมีได้เพียงหนึ่งคอลัมน์ในตารางของคุณ MAXขนาดแถวใน MySQL เป็น 64k ดังนั้นหากคุณมีคอลัมน์ 64k นั่นคือทั้งหมดที่คุณได้รับ ข้อ จำกัด เดียวกันนี้ใช้ไม่ได้กับvarchar(max)ประเภทคอลัมน์ของ SQL Server
joshperry

1
@ joshperry ใช่ แต่คอลัมน์ TEXT / BLOB จะนับเฉพาะจำนวนเล็กน้อย (9-12 ไบต์) ไปยังขีด จำกัด ขนาดแถว 64KB ดังนั้นหากคุณต้องการ VARCHAR ขนาดใหญ่และคอลัมน์อื่น ๆ จะดีกว่าถ้าใช้ TEXT
Bill Karwin

74

TLDR; MySql ไม่มีแนวคิดเทียบเท่าvarchar(max)นี่คือคุณสมบัติ MS SQL Server

VARCHAR (สูงสุด) คืออะไร

varchar(max) เป็นคุณสมบัติของ Microsoft SQL Server

จำนวนข้อมูลที่คอลัมน์สามารถจัดเก็บในรุ่นเซิร์ฟเวอร์ Microsoft SQL ก่อนหน้ารุ่น 2005 ถูก จำกัด ที่ 8KB เพื่อที่จะเก็บมากกว่า 8KB คุณจะต้องใช้TEXT, NTEXTหรือBLOBคอลัมน์ประเภทประเภทคอลัมน์เหล่านี้ข้อมูลที่เก็บไว้ของพวกเขาเป็นคอลเลกชันของ 8K หน้าแยกจากหน้าข้อมูลตาราง; พวกเขารองรับการจัดเก็บมากถึง 2GB ต่อแถว

ข้อแม้ใหญ่ประเภทคอลัมน์เหล่านี้คือการที่พวกเขามักจะต้องฟังก์ชั่นพิเศษและงบในการเข้าถึงและแก้ไขข้อมูล (เช่นREADTEXT, WRITETEXTและUPDATETEXT )

ใน SQL Server 2005 varchar(max)ถูกนำมาใช้เพื่อรวมข้อมูลและแบบสอบถามที่ใช้ในการดึงและแก้ไขข้อมูลในคอลัมน์ขนาดใหญ่ ข้อมูลสำหรับvarchar(max)คอลัมน์จะถูกจัดเก็บแบบอินไลน์กับหน้าข้อมูลตาราง

เมื่อข้อมูลในคอลัมน์ MAX เติมหน้าข้อมูล 8KB หน้าล้นจะได้รับการจัดสรรและหน้าก่อนหน้าชี้ไปที่มันเป็นรายการที่เชื่อมโยง ซึ่งแตกต่างจากTEXT, NTEXTและคอลัมน์ชนิดสนับสนุนทุกความหมายแบบสอบถามเดียวกันกับประเภทคอลัมน์อื่น ๆBLOBvarchar(max)

ดังนั้นvarchar(MAX)จริงๆแล้วหมายถึงvarchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)และไม่varchar(MAX_SIZE_OF_A_COLUMN)และไม่ได้

MySql ไม่มีสำนวนที่เทียบเท่ากัน

เพื่อให้ได้พื้นที่เก็บข้อมูลเท่ากันกับ a varchar(max)ใน MySql คุณจะต้องเปลี่ยนเป็นBLOBประเภทคอลัมน์ บทความนี้กล่าวถึงวิธีที่มีประสิทธิภาพมากในการจัดเก็บข้อมูลจำนวนมากใน MySql ได้อย่างมีประสิทธิภาพ


1
สิ่งนี้เกี่ยวข้องกับ SQL Server มากกว่า MySQL
มิต

14
@njk ใช่ แต่เพื่อที่จะอธิบายว่า "เทียบเท่า" ใน MySql (หรือการขาดความเท่าเทียมกันในกรณีนี้) จำเป็นต้องอธิบายสิ่งที่หมายถึงvarchar(max) จริงๆ
joshperry

29

ความยาวสูงสุดของ varchar คือ

65535

หารด้วยความยาวสูงสุดไบต์ของอักขระในชุดอักขระคอลัมน์ถูกตั้งค่าเป็น (เช่น utf8 = 3 ไบต์, ucs2 = 2, latin1 = 1)

ลบ 2 ไบต์เพื่อเก็บความยาว

ลบความยาวของคอลัมน์อื่นทั้งหมด

ลบ 1 ไบต์สำหรับทุก 8 คอลัมน์ที่เป็นโมฆะ หากคอลัมน์ของคุณเป็นโมฆะ / ไม่เป็นโมฆะสิ่งนี้จะถูกจัดเก็บเป็นหนึ่งบิตในไบต์ / ไบต์ที่เรียกว่ามาสก์ null ซึ่งเป็น 1 บิตต่อคอลัมน์ที่เป็นโมฆะ


ฉันชอบรูปแบบของคำตอบของคุณ แต่ดูเหมือนว่าจะขาดข้อมูลที่เป็นประโยชน์ที่คำตอบยอดนิยมให้เกี่ยวกับ charsets และสิ่งของ
Joe Phillips

3

สำหรับเซิร์ฟเวอร์ SQL

แก้ไขตาราง prg_ar_report_colors เพิ่ม Text_Color_Code VARCHAR (สูงสุด);

สำหรับ MySql

แก้ไขตาราง prg_ar_report_colors เพิ่ม Text_Color_Code longtext;

สำหรับ Oracle

แก้ไขตาราง prg_ar_report_colors เพิ่ม Text_Color_Code CLOB;


1
โปรดทราบว่า longtext ข้อความและหยดถูกเก็บแตกต่างจาก varchar varchar จะถูกเก็บไว้กับเขตข้อมูลอื่น ๆ ในขณะที่ข้อความจะถูกเก็บไว้ในไฟล์แยกต่างหากในเซิร์ฟเวอร์ มันมีข้อดีข้อเสียระวังอย่างหนึ่งที่เลือก
santiago arizti

0

Mysql แปลงคอลัมน์จาก VARCHAR เป็น TEXT เมื่อมีขนาด จำกัด !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

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