SQL Server ชนิดข้อความกับชนิดข้อมูล varchar [ปิด]


287

ฉันมีข้อมูลตัวอักขระความยาวผันแปรและต้องการเก็บไว้ในฐานข้อมูล SQL Server (2005) ฉันต้องการเรียนรู้แนวปฏิบัติที่ดีที่สุดเกี่ยวกับวิธีเลือก TEXT SQL type หรือเลือก VARCHAR SQL type ข้อดีและข้อเสียในประสิทธิภาพ / footprint / function


17
ถ้า Google ส่งคุณมาที่นี่: หน้าประเภทข้อมูล MSDN SQLอาจช่วยได้
Jeroen

คำตอบ:


212

หากคุณกำลังใช้ SQL Server 2005 varchar(MAX)หรือภายหลังการใช้งาน textประเภทข้อมูลจะเลิกและไม่ควรนำมาใช้สำหรับการทำงานการพัฒนาใหม่ จากเอกสาร :

สำคัญ

ntext, textและimageประเภทข้อมูลจะถูกลบใน Microsoft SQL Server รุ่นอนาคต หลีกเลี่ยงการใช้ชนิดข้อมูลเหล่านี้ในงานพัฒนาใหม่และวางแผนที่จะแก้ไขแอปพลิเคชันที่ใช้งานอยู่ในปัจจุบัน ใช้nvarchar (สูงสุด) , varchar (สูงสุด)และvarbinary (สูงสุด)แทน


3
ขอบคุณ Mladen ฉันประหลาดใจที่เห็นว่า TEXT เลิกใช้แล้ว คุณมีเอกสารอย่างเป็นทางการที่กล่าวถึงเรื่องนี้หรือไม่?
George2

1
แม้ว่านี่จะไม่ใช่ "เป็นทางการ" แต่จะครอบคลุมพื้นฐาน อันที่จริงแล้วข้อความเสื่อมราคาและไม่รองรับทุกสิ่งที่ varchar (สูงสุด) ทำเช่นความสามารถในการค้นหาและดัชนี blog.sqlauthority.com/2007/05/26/…
achinda99

32
นี่เป็น offcial ตามที่ได้รับ :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic

1
เยี่ยม achinda99 และ Mladen Prajdic! สิ่งที่คุณให้คือสิ่งที่ฉันกำลังมองหา :-) อีกหนึ่งคำถามเราจะเลือกว่าจะใช้ VARCHAR หรือ VARCHAR (MAX) ในสถานการณ์ที่แตกต่างกันอย่างไร
George2

1
ข้อมูล MS อย่างเป็นทางการเกี่ยวกับเรื่องนี้ถูกคัดค้าน: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda

283

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

VARCHARจะถูกเก็บไว้ในแถวและมีความยาวไม่เกิน8000อักขระ หากคุณพยายามสร้าง a VARCHAR(x)โดยที่x> 8000คุณจะได้รับข้อผิดพลาด:

เซิร์ฟเวอร์: ข่าวสารเกี่ยวกับ 131, ระดับ 15, สถานะ 3, บรรทัด 1

ขนาด () ที่กำหนดให้กับประเภท 'varchar' เกินขนาดสูงสุดที่อนุญาตสำหรับชนิดข้อมูลใด ๆ (8000)

ข้อจำกัดความยาวเหล่านี้ไม่เกี่ยวข้องVARCHAR(MAX)ในSQL Server 2005ซึ่งอาจถูกจัดเก็บไว้นอกแถวเหมือนTEXTกัน

โปรดทราบว่าMAXไม่ได้เป็นชนิดคงที่นี่VARCHARและเป็นชนิดที่แตกต่างกันมากหลังถูกมากใกล้เคียงกับVARCHAR(MAX)TEXT

ในSQL Serverเวอร์ชันก่อนหน้านี้คุณไม่สามารถเข้าถึงTEXTโดยตรงคุณสามารถรับTEXTPTRและใช้งานREADTEXTและWRITETEXTฟังก์ชันได้

ในSQL Server 2005คุณสามารถเข้าถึงTEXTคอลัมน์ได้โดยตรง(แต่คุณยังต้องใช้การส่งแบบชัดแจ้งVARCHARเพื่อกำหนดค่าให้กับคอลัมน์เหล่านั้น)

TEXT ดี:

  • หากคุณต้องการเก็บข้อความขนาดใหญ่ในฐานข้อมูลของคุณ
  • หากคุณไม่ได้ค้นหาค่าของคอลัมน์
  • หากคุณเลือกคอลัมน์นี้ไม่ค่อยและไม่ได้เข้าร่วม

VARCHAR ดี:

  • ถ้าคุณเก็บสายเล็ก ๆ
  • หากคุณค้นหาค่าสตริง
  • หากคุณเลือกหรือใช้ร่วมกันเสมอ

ด้วยการเลือกที่นี่ฉันหมายถึงการออกแบบสอบถามใด ๆ ที่ส่งคืนค่าของคอลัมน์

โดยการค้นหาที่นี่หมายถึงการออกแบบสอบถามใด ๆ ที่ผลลัพธ์ขึ้นอยู่กับค่าของคอลัมน์TEXTหรือ VARCHARซึ่งรวมถึงการใช้มันในการใด ๆJOINหรือWHEREสภาพ

เนื่องจากTEXTถูกเก็บไว้นอกแถวการสืบค้นที่ไม่เกี่ยวข้องกับTEXTคอลัมน์จึงมักจะเร็วกว่า

ตัวอย่างของสิ่งที่TEXTดีสำหรับ:

  • ความคิดเห็นบล็อก
  • หน้าวิกิ
  • รหัสแหล่งที่มา

ตัวอย่างของสิ่งที่VARCHARดีสำหรับ:

  • ชื่อผู้ใช้
  • ชื่อหน้า
  • ชื่อไฟล์

ตามกฎของหัวแม่มือถ้าคุณเคยต้องการให้คุณค่าข้อความเกิน200ตัวอักษรและTEXTไม่ได้ใช้ร่วมในคอลัมน์นี้ใช้

VARCHARมิฉะนั้นใช้

PSเช่นเดียวกับการUNICODEเปิดใช้งานNTEXTและNVARCHARเช่นกันซึ่งคุณควรใช้สำหรับตัวอย่างข้างต้น

PPSเช่นเดียวกับVARCHAR(MAX)และNVARCHAR(MAX)ที่SQL Server 2005ใช้แทนและTEXT NTEXTคุณจะต้องเปิดใช้งานlarge value types out of rowสำหรับพวกเขาด้วยsp_tableoptionหากคุณต้องการให้พวกเขาออกจากแถว

ดังกล่าวข้างต้นและที่นี่ , TEXTเป็นไปได้เลิกใช้ในอนาคต:

text in rowตัวเลือกจะถูกลบออกในรุ่นอนาคตของSQL Server text in rowหลีกเลี่ยงการใช้ตัวเลือกนี้ในการพัฒนางานใหม่และวางแผนที่จะปรับเปลี่ยนการใช้งานที่ใช้งานในปัจจุบัน เราขอแนะนำให้คุณจัดเก็บข้อมูลขนาดใหญ่โดยใช้varchar(max), nvarchar(max)หรือvarbinary(max)ชนิดข้อมูล ในการควบคุมพฤติกรรมในแถวและนอกแถวของชนิดข้อมูลเหล่านี้ให้ใช้large value types out of rowตัวเลือก


2
1. "ถ้าคุณไม่ค้นหาค่าของคอลัมน์" - คุณช่วยแสดงให้ฉันเห็นว่า "ค้นหา" หมายความว่าอะไร คุณหมายถึงเลือกคอลัมน์นี้สั่งซื้อคอลัมน์นี้ชอบคอลัมน์นี้หรือใช้ฟังก์ชั่นการจัดการสตริงในคอลัมน์นี้?
George2

2
2. "VARCHAR จะถูกเก็บไว้ในแถวเสมอและมีความยาวไม่เกิน 8000 อักขระ" - ขอโทษฉันไม่เห็นด้วยกับคุณ VARCHAR อาจยาวกว่า 8000 และหากยาวกว่า 8000 VARCHAR จะถูกเก็บไว้นอกเหนือจากในคอลัมน์ มีคำแนะนำอะไรมั้ย?
George2

1
3. Mladen Prajdic ที่กล่าวถึงในหัวข้อนี้ประเภทข้อความถูกเลิกใช้ แต่ฉันไม่พบเอกสารใด ๆ ที่ครอบคลุมถึงสิ่งนี้ คุณมีเอกสารครอบคลุมถึงเรื่องนี้หรือไม่?
George2

2
Cool Quassnoi! คุณช่างน่าเชื่อถือจริงๆ! :-) อีกหนึ่งคำถาม - "แน่นอนว่านี่ไม่เกี่ยวข้องกับ VARCHAR (MAX) ซึ่งเป็นคำพ้องสำหรับ TEXT ของ SQL Server 2005 "นี่" คุณหมายถึงอะไร
George2

"หลักสูตรนี้ไม่เกี่ยวข้องกับ VARCHAR (MAX) ซึ่งเป็นคำพ้องสำหรับ TEXT ของ SQL SERVER 2005" คุณมีเอกสารใดบ้างที่ระบุว่า TEXT เหมือนกับ VARCHAR ใน SQL Server 2005 ฉันทำการค้นหาบางอย่าง แต่ไม่พบเอกสารที่เป็นทางการ :-)
George2

42

ในเซิร์ฟเวอร์ SQL 2005 ประเภทข้อมูลใหม่แนะนำ: varchar(max)และnvarchar(max) พวกเขามีข้อได้เปรียบของการพิมพ์ข้อความเก่าที่พวกเขาสามารถมี op ถึง 2GB ของข้อมูล แต่พวกเขายังมีประโยชน์มากที่สุดของและvarchar nvarcharข้อดีเหล่านี้คือความสามารถในการใช้ฟังก์ชันการจัดการสตริงเช่น substring ()

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

กล่าวโดยย่ออย่าใช้ข้อความเนื่องจากมีทางเลือกที่ดีกว่า: (n) varchar (สูงสุด) และใช้เฉพาะ varchar (สูงสุด) เมื่อ varchar ปกติไม่ใหญ่พอนั่นคือถ้าคุณคาดว่าสตริง teh ที่คุณจะเก็บจะเกิน 8000 ตัวอักษร

ตามที่ระบุไว้คุณสามารถใช้ SUBSTRING ในประเภทข้อมูล TEXT แต่ตราบใดที่ฟิลด์ TEXT มีอักขระน้อยกว่า 8000 ตัว


1
ขอบคุณ Edoode คุณตอบค่อนข้างสมบูรณ์ว่า VARCHAR ดีแค่ไหน แต่ความคิดเห็นหรือความคิดเห็นใด ๆ เกี่ยวกับเวลาที่จะใช้ VARCHAR และเมื่อใดที่จะใช้ TEXT คำถามของฉันเกี่ยวกับการเลือก 1 จาก 2 ปัญหา :-)
George2

1
ที่จริงแล้วใน MS SQL Server 2005 คุณสามารถใช้ SUBSTRING และฟังก์ชั่นอื่น ๆ ในคอลัมน์ TEXT ได้เช่นกัน
Quassnoi

1
ขอบคุณ Quassnoi! ดูเหมือนว่า TEXT จะเลิกใช้แล้ว คำถามอีกข้อหนึ่งเราจะเลือกว่าจะใช้ VARCHAR หรือ VARCHAR (MAX) ในสถานการณ์ต่าง ๆ ได้อย่างไร
George2

1
ใช้เฉพาะ varchar (สูงสุด) เมื่อ varchar ปกติไม่ใหญ่พอ (8Kb ควรเพียงพอสำหรับทุกคน;)
edosoft

7

มีการเปลี่ยนแปลงที่สำคัญบางอย่างใน ms 2008 -> อาจมีค่าเมื่อพิจารณาบทความต่อไปนี้เมื่อทำการตัดสินใจเกี่ยวกับชนิดข้อมูลที่จะใช้ http://msdn.microsoft.com/en-us/library/ms143432.aspx

จำนวนไบต์ต่อ

  1. varchar (สูงสุด), varbinary (สูงสุด), xml, ข้อความหรือคอลัมน์ภาพ 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (สูงสุด) คอลัมน์ 2 ^ 30-1 2 ^ 30-1

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