ทำความเข้าใจกับ varchar (สูงสุด) 8000 คอลัมน์และทำไมฉันถึงสามารถเก็บได้มากกว่า 8000 ตัวอักษร


13

จากเอกสารของ Microsoft นี้ +

n กำหนดความยาวสตริงและสามารถเป็นค่าตั้งแต่ 1 ถึง 8,000 max บ่งชี้ว่าขนาดหน่วยเก็บข้อมูลสูงสุดคือ 2 ^ 31-1 ไบต์ (2 GB) ขนาดการจัดเก็บข้อมูลเป็นความยาวจริงของข้อมูลที่ป้อน + 2 ไบต์

โปรดช่วยฉันเข้าใจสิ่งนี้

อักขระสูงสุดสำหรับ varchar น่าจะเป็น8000ซึ่งน้อยกว่า2GBมูลค่าของข้อมูล

ฉันเห็นว่ามีระเบียนในvarchar(max)คอลัมน์ของตารางเฉพาะที่มีlen(mycolumn)> 100,000 ดังนั้นฉันรู้ว่าฉันจะได้รับมากกว่า8000อักขระลงในvarchar(max)คอลัมน์

คำถามที่ 1:อย่างไร8000ตัวละครเข้ามาเล่นและที่ฉันควรจะตระหนักถึงมันได้หรือไม่

คำถามที่ 2 : ข้อความค้นหา. dat สุทธิไปยังคอลัมน์นี้จะแสดงผลลัพธ์แบบเต็มด้วยอักขระ 100 000+ ตัวเสมอหรือไม่


โปรดทราบว่าvarchar(max)ครั้งหนึ่งเคยถูกเรียกใช้textและถือเป็นประเภทข้อมูลอื่น
นาย Lister

บางทีอ่านนี้ ? มันเกี่ยวข้องกับขนาดหน้า 8K ค่าที่มีขนาดใหญ่เกินไปที่จะพอดีในหน้าเดียว (จริง ๆ แล้วขีด จำกัด ที่ใหญ่กว่า 8000) จะถูกบันทึกลงในหน้า LOB_DATA (OBject ขนาดใหญ่)
Justin

คำตอบ:


30

ฉันสามารถดูว่าทำไมคุณเข้าใจผิดนี้ - มันเป็นเรื่องยุ่งยากเล็กน้อย สิ่งเหล่านี้ใช้ได้ทั้งหมด:

  • VARCHAR (1) - สตริงอักขระหนึ่งตัว
  • VARCHAR (4000) - 4,000 ตัวอักษร
  • VARCHAR (8000) - 8,000 ตัวอักษร - และหากคุณใช้ตัวเลขสำหรับคำจำกัดความของฟิลด์นี้นั่นคือจำนวนสูงสุดที่คุณสามารถใช้ได้ แต่ดูสิ่งนี้:
  • VARCHAR (MAX) - ตัวหนึ่งมีขนาดสูงสุด 2GB

และใช่ถ้าคุณพยายามดึงข้อมูลออกจากเขตข้อมูล VARCHAR (MAX) และมีคนเก็บ 2GB ไว้ในนั้น


3
and somebody stored 2GB in there, buckle up.- เคยมาพร้อมกับไฟล์ Blob สองสามไฟล์
Ruslan

7

คำถามที่ 1: ตัวละคร 8000 ตัวมีบทบาทอย่างไรและฉันควรทราบได้อย่างไร

การตั้งค่า n ถึง 8000 ทำให้มีตัวละคร 8000 ตัว คุณต้องระวังการอ้างอิงPrecision, Scale และ Length (Transact-SQL)เกี่ยวกับ char, nchar, nvarchar และ varchar ในทางตรงกันข้ามการตั้งค่า n เป็นสูงสุด (ไม่มีเครื่องหมายคำพูด) ทำให้ SQL Server เก็บ (และส่งคืน) จำนวนไบต์สูงสุด (ตามที่ระบุไว้ในเครื่องหมายคำพูดของคุณ)

คำถามที่ 2: ข้อความค้นหา. dat สุทธิไปยังคอลัมน์นี้จะแสดงผลลัพธ์แบบเต็มด้วยอักขระ 100 000+ ตัวเสมอหรือไม่

นี่เป็นคำถาม. Net (ไม่ใช่เซิร์ฟเวอร์ SQL) แต่ตัวแบ่งข้อมูล. Net เรียกกระแสข้อมูลเป็นไบต์ ไบต์ไม่ใช่อักขระและ SQL Server ส่งคืนไบต์ (ไม่ใช่อักขระ) ถ้า n ถูกตั้งค่าเป็น 8000 และชนิดข้อมูลคือ nvarchar, SQL Server จะส่งกลับได้สูงถึง 8000 ไบต์ซึ่งตัวกระจายข้อมูล. Net สามารถตีความได้ว่าเป็นอักขระ Unicode 4000 ตัว ถ้า n ถูกตั้งค่าเป็น 8000 และชนิดข้อมูลคือ varchar, SQL Server จะส่งกลับได้สูงสุด 8000 ไบต์ซึ่งตัวจัดเก็บข้อมูล. Net สามารถแปลความหมายได้สูงสุด 8000 ANSI ตัวอักษร ถ้า n ถูกตั้งค่าเป็น max และชนิดข้อมูลคือ nvarchar, SQL Server จะส่งกลับค่าสูงสุด 2 ^ 31-1 ไบต์ซึ่งตัวแบ่งข้อมูล. Net สามารถตีความได้ถึง (2 ^ 31-1) / 2 ตัวอักษร ถ้า n ถูกตั้งค่าเป็น max และชนิดข้อมูลคือ varchar, SQL Server จะส่งกลับค่าสูงสุด 2 ^ 31-1 ไบต์ซึ่งตัวจัดเก็บข้อมูล. Net สามารถแปลความหมายได้ถึง 2 ^ 31-1 อักขระ ANSI

หากคุณเลือกใช้ char หรือ varchar (แทนที่จะเป็น nchar หรือ nvarchar) เพราะพวกเขาสามารถเก็บ "ตัวอักษร" ได้มากขึ้น (แม่นยำยิ่งขึ้น: ไบต์) คุณต้องระวังว่าอักขระ Unicode จำนวนมากไม่มีอักขระ ANSI ที่เทียบเท่ากันดังนั้นส่วนใหญ่ของเรา ผู้ใช้ทั่วโลกจะไม่สามารถเห็นอักขระที่แปลเป็นภาษาท้องถิ่น / ในแอปของคุณ)

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