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.