nvarchar (สูงสุด) vs NText


183

ข้อดีและข้อเสียของการใช้nvarchar(max)vs. กับNTextชนิดข้อมูลใน SQL Server คืออะไร ฉันไม่ต้องการความเข้ากันได้แบบย้อนหลังดังนั้นจึงเป็นเรื่องปกติที่nvarchar(max)ไม่รองรับ SQL Server รุ่นเก่า

แก้ไข:เห็นได้ชัดว่าคำถามนี้ใช้กับTEXTและIMAGEเทียบกับvarchar(max)และvarbinary(max)สำหรับผู้ที่ค้นหาประเภทข้อมูลเหล่านั้นในภายหลัง

คำตอบ:


197

ข้อดีคือที่คุณสามารถใช้ฟังก์ชั่นเหมือนLENและLEFTบนnvarchar(max)และคุณไม่สามารถทำเช่นนั้นกับและntext textนอกจากนี้ยังเป็นเรื่องง่ายที่จะทำงานร่วมกับnvarchar(max)กว่าtextที่คุณจะต้องใช้และWRITETEXTUPDATETEXT

นอกจากนี้text, ntextฯลฯ จะถูกเลิก ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
เห็นได้ชัดว่าSQL Server 2016ยังคงให้การสนับสนุน
บรรจบกัน

1
@Confluence ในอดีตเป็นข้อความและ nText ชนิดข้อมูลเก่ากว่า varchar และ nvarchar เท่าที่มีอยู่ใน SQL Server ที่เกี่ยวข้อง?
RBT

คุณไม่จำเป็นต้องใช้ WRITETEXT และ UPDATETEXT บางทีในปี 2010 คุณทำอย่างนั้น! สนใจข้อมูลเพิ่มเติม
Simon_Weaver

38

VARCHAR(MAX)มีขนาดใหญ่พอที่จะรองรับTEXTฟิลด์ TEXT, NTEXTและIMAGEชนิดข้อมูลของ SQL Server 2000 จะเลิกใช้ในรุ่นอนาคตของ SQL Server, SQL Server 2005 ให้กันได้ย้อนหลังไปชนิดข้อมูล แต่ก็จะแนะนำให้ใช้ชนิดข้อมูลใหม่ที่มีVARCHAR(MAX), และNVARCHAR(MAX)VARBINARY(MAX)


32

ntextจะเก็บข้อมูลไว้ในหน้าฐานข้อมูลแยกต่างหากเสมอในขณะที่nvarchar(max)พยายามจัดเก็บข้อมูลภายในบันทึกฐานข้อมูลเอง

ดังนั้นจึงnvarchar(max)ค่อนข้างเร็ว (ถ้าคุณมีข้อความที่เล็กกว่า 8 kB) ฉันยังสังเกตเห็นว่าขนาดฐานข้อมูลจะเพิ่มขึ้นช้าลงเล็กน้อยซึ่งก็ดีเช่นกัน

nvarchar(max)ไป


13

nvarchar(max)คือสิ่งที่คุณต้องการใช้ ข้อได้เปรียบที่ใหญ่ที่สุดคือคุณสามารถใช้ฟังก์ชันสตริง T-SQL ทั้งหมดในชนิดข้อมูลนี้ ntextนี้ไม่ได้เป็นไปได้ด้วย ฉันไม่ได้ตระหนักถึงข้อเสียที่แท้จริง


สิ่งที่ฉันไม่เข้าใจคือพวกเขาบอกว่าจะไปด้วยnvarchar(max)แต่นั่นทำให้ฉันมีความยาวไม่เกิน 4,000 ตัวอักษร ถ้าฉันต้องการให้ฟิลด์ค้างไว้มากกว่านั้น
VoidKing

2
nvarchar (สูงสุด) ไม่ จำกัด คุณเพียง 4000 ตัวอักษร คุณมีอักขระไม่ จำกัด จำนวน นอกจากนี้ข้อความและ ntext นั้นเลิกใช้แล้วโดย SQL Server ซึ่งหมายความว่าในรุ่นอนาคตพวกเขาจะไม่ได้รับการสนับสนุนอีกต่อไป
Randy Minder

OIC ฉันใช้ SQL Server CE ซึ่ง จำกัดnvarchar(max)ไว้ที่ 4000 ตัวอักษร ดังนั้นสำหรับ SQL Server Compact ฉันไม่มีทางเลือกนอกจากใช้ntextในบางกรณี เมื่อพวกเขาหยุดฉันคิดว่าฉันจะต้องไม่อัปเกรดบางไซต์
VoidKing

1
@RandyMinder nvarchar (สูงสุด) ไม่ใช่ที่เก็บข้อมูลแบบไม่ จำกัด ตามเอกสารคู่มือ SQL Server "max บ่งชี้ว่าขนาดหน่วยเก็บข้อมูลสูงสุดคือ 2 ^ 31-1 ไบต์ (2 GB) ขนาดหน่วยเก็บข้อมูลเป็นไบต์คือสองเท่าของความยาวจริงของข้อมูลที่ป้อน + 2 ไบต์"
ชีฟ


4

ข้อเสียที่ใหญ่ที่สุดของText(ร่วมกับNTextและImage) ก็คือว่ามันจะถูกลบออกในรุ่นอนาคตของ SQL Server, โดยเอกสาร สิ่งนี้จะทำให้สกีมาของคุณยากขึ้นในการอัพเกรดเมื่อ SQL Server นั้นจะวางจำหน่าย


3

ต้องการเพิ่มประสบการณ์ของฉันด้วยการแปลง ฉันมีหลายtextสาขาในรหัส Linq2SQL โบราณ นี่เป็นการอนุญาตให้textคอลัมน์ที่อยู่ในดัชนีสร้างขึ้นมาใหม่ออนไลน์สร้างขึ้นมาใหม่ออนไลน์

ครั้งแรกที่ฉันรู้เกี่ยวกับประโยชน์หลายปี แต่การสันนิษฐานเสมอว่าการแปลงจะหมายถึงข้อความค้นหาที่น่ากลัวที่ SQL Server จะต้องสร้างตารางใหม่และคัดลอกทุกอย่างลงทำให้เว็บไซต์ของฉันแย่ลง

ฉันยังกังวลว่า Linq2SQL อาจทำให้เกิดข้อผิดพลาดหากทำการตรวจสอบประเภทคอลัมน์บางประเภท

มีความสุขที่ได้รายงานว่าคำสั่ง ALTER ส่งคืนทันที - ดังนั้นพวกเขาจึงเปลี่ยนเฉพาะข้อมูลเมตาของตารางเท่านั้น อาจมีงานออฟไลน์เกิดขึ้นเพื่อนำข้อมูลอักขระ <8000 ตัวกลับมาให้อยู่ในตาราง แต่คำสั่ง ALTER นั้นทันที

ฉันวิ่งต่อไปนี้เพื่อค้นหาคอลัมน์ทั้งหมดที่ต้องการการแปลง:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

สิ่งนี้ทำให้ฉันมีรายการแบบสอบถามที่ดีซึ่งฉันเพิ่งเลือกและคัดลอกไปยังหน้าต่างใหม่ อย่างที่ฉันบอก - การทำแบบนี้เป็นแบบทันที

ป้อนคำอธิบายรูปภาพที่นี่

Linq2SQL นั้นค่อนข้างเก่าแก่ - ใช้นักออกแบบที่คุณลากตารางลงไป สถานการณ์อาจซับซ้อนกว่าสำหรับรหัส EF ก่อน แต่ฉันยังไม่ได้แก้ไขเลย


1

ฉันต้องการเพิ่มว่าคุณสามารถใช้ส่วนคำสั่ง. WHITEสำหรับการอัปเดตบางส่วนหรือทั้งหมดและประสิทธิภาพสูงผนวกกับvarchar(max)/nvarchar(max)ชนิดข้อมูล

ที่นี่คุณสามารถพบตัวอย่างเต็มรูปแบบของการใช้.WRITEประโยค

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