ความแตกต่างระหว่าง varchar และ nvarchar คืออะไร?


1354

มันเป็นเพียงที่nvarcharรองรับอักขระหลายไบต์? หากเป็นกรณีที่มีจริงๆจุดใด ๆ นอกเหนือจากความกังวลเกี่ยวกับการจัดเก็บข้อมูลเพื่อใช้varchars?


6
ฉันชอบประเด็นของ incomudro มันทำให้ฉันขุดไปรอบ ๆ เกี่ยวกับความแตกต่างระหว่าง varchar & nvarchar ในตอนแรก แอป Java ของเรากับ SQL Server db ใช้ myBatis ซึ่งดูเหมือนว่าจะส่งสตริงเป็น nvarchar โดยค่าเริ่มต้น (ยังไม่แน่ใจว่า (หรือถ้า) ที่สามารถแทนที่ได้) แบบสอบถามแบบง่าย ๆ ปรากฏขึ้นเป็นปัญหาด้านประสิทธิภาพอย่างมากเพราะฉันได้กำหนดคอลัมน์ที่เลือกไว้เป็น varchar ไม่ใช่ nvarchar และไม่สนใจดัชนีในคอลัมน์
ฌอนอ่าน

คำตอบ:


1652

nvarcharคอลัมน์สามารถจัดเก็บข้อมูล Unicode ใด ๆ varcharคอลัมน์ถูก จำกัด ไปยังเพจรหัส 8 บิต บางคนคิดว่าvarcharควรใช้เพราะใช้พื้นที่น้อย ฉันเชื่อว่านี่ไม่ใช่คำตอบที่ถูกต้อง ความไม่เสถียรของเพจรหัสเป็นความเจ็บปวดและ Unicode เป็นวิธีแก้ปัญหาโค้ดเพจ ด้วยราคาถูกดิสก์และหน่วยความจำทุกวันนี้ไม่มีเหตุผลที่จะเสียเวลากับหน้ารหัสอีกต่อไป

ระบบปฏิบัติการและแพลตฟอร์มการพัฒนาที่ทันสมัยทั้งหมดใช้ Unicode ภายใน โดยใช้nvarcharมากกว่าvarcharคุณสามารถหลีกเลี่ยงการเข้ารหัสการแปลงทุกครั้งที่คุณอ่านหรือเขียนลงในฐานข้อมูล การแปลงต้องใช้เวลาและมีแนวโน้มที่จะเกิดข้อผิดพลาด และการกู้คืนจากข้อผิดพลาดในการแปลงเป็นปัญหาที่ไม่สำคัญ

หากคุณกำลังเชื่อมต่อกับแอปพลิเคชันที่ใช้เฉพาะ ASCII ฉันยังคงแนะนำให้ใช้ Unicode ในฐานข้อมูล ระบบปฏิบัติการและอัลกอริธึมการเรียงฐานข้อมูลจะทำงานได้ดีขึ้นเมื่อใช้ Unicode Unicode หลีกเลี่ยงปัญหาการแปลงเมื่อเชื่อมต่อกับระบบอื่น และคุณจะเตรียมพร้อมสำหรับอนาคต และคุณสามารถตรวจสอบได้เสมอว่าข้อมูลของคุณถูก จำกัด ไว้ที่ 7 บิต ASCII สำหรับระบบเดิมที่คุณต้องดูแลรักษาแม้ในขณะที่เพลิดเพลินกับสิทธิประโยชน์บางประการของการจัดเก็บ Unicode แบบเต็ม


8
นี่คือข้อมูลที่ดีที่จะมี ดังนั้นฉันเข้าใจสิ่งนี้อย่างถูกต้องหรือไม่หากฉันอนุมานได้ว่าทางเลือกในท้ายที่สุดกลายเป็นหนึ่งใน - ทรัพยากรใดที่ราคาถูกกว่า: ค่าใช้จ่ายในการประมวลผล + การพัฒนาหรือการจัดเก็บ?
Matt Cashatt

141
@MatthewPatrickCashatt - คุณสามารถเห็นมันเป็นอย่างนั้น แต่ถ้าคุณจินตนาการถึงโลกอันรุ่งโรจน์ซึ่งข้อมูลข้อความทั้งหมดอยู่ใน Unicode และนักพัฒนาก็ไม่จำเป็นต้องคิดเกี่ยวกับการเข้ารหัสสิ่งที่อยู่และข้อผิดพลาดทั้งชั้นก็ไม่เคยเกิดขึ้นคุณจะเห็นว่ามี ไม่มีทางเลือกเลยจริงๆ
Jeffrey L Whitledge


8
@Martin Smith - ในกรณีเหล่านั้นข้อดีเล็กน้อยที่ varchar confers (ที่เก็บข้อมูลขนาดกะทัดรัด) หายไป ฉันคิดว่า varchar เลวร้ายยิ่งกว่าที่ฉันคิดไว้!
Jeffrey L Whitledge

9
@PeterAllenWebb - คุณสามารถ "จัดเก็บ" ข้อมูล Unicode ใด ๆ ได้เนื่องจากคู่ตัวแทนใน UTF-16 สามารถเก็บไว้ใน UCS-2 ราวกับว่าพวกเขาเป็นตัวละคร ที่จะทำงานอย่างโปร่งใสสำหรับการจัดเก็บข้อมูลและการดึง ตอนนี้สิ่งที่คุณทำไม่ได้ก็คือการเปลี่ยนแปลงและการเปรียบเทียบกรณีที่เชื่อถือได้นอก BMP แต่ฉันไม่ได้เรียกร้องอะไรเลย ดังนั้นหากคุณมีข้อความ Desseret จำนวนมากที่คุณต้องการทำการประมวลผลมันจะเป็นการดีที่สุดที่จะทำเช่นนั้นนอกฐานข้อมูล แต่มันก็โอเคสำหรับการจัดเก็บที่นั่น (แน่นอนว่า varchar จะไม่ช่วยคุณที่นั่นด้วย!)
Jeffrey L Whitledge

259

varchar : ข้อมูลอักขระที่มีความยาวไม่ผันแปรและไม่ใช่ Unicode การเปรียบเทียบฐานข้อมูลจะกำหนดหน้ารหัสที่ข้อมูลจะถูกเก็บไว้โดยใช้

nvarchar : ข้อมูลอักขระ Unicode ที่มีความยาวผันแปรได้ ขึ้นอยู่กับการเปรียบเทียบฐานข้อมูลสำหรับการเปรียบเทียบ

อาวุธที่มีความรู้นี้ใช้อย่างใดอย่างหนึ่งตรงกับข้อมูลที่คุณป้อน (ASCII v. Unicode)


5
มีข้อ จำกัด เช่น varchar ไม่สามารถเก็บข้อมูล Unicode ได้หรือไม่ มันคือทั้งหมด 1 และ 0 ฉันสามารถบันทึกเนื้อหาภาษาจีนได้เนื่องจาก varchar ใช้ได้ดีกับฐานข้อมูลของฉัน ฉันเพิ่งระบุ UTF-8 แล้วมันทำงานยังไง?
Nishant

3
@ คำตอบสำหรับผู้ล่าช้า: แน่นอนคุณสามารถเก็บ UTF-8 ใน varchar แต่มันจะทำลายฟังก์ชั่นสตริงของ SQL Server หากคุณทำการค้นหา / เปลี่ยนแปลงทั้งหมดภายในแอปพลิเคชันของคุณใช่แล้วคุณสามารถทำได้ (แต่จะมีประโยชน์อะไรบ้าง) เฉพาะการเข้ารหัส Unicode ที่สนับสนุนโดย SS คือ UCS-2 (ใช่ไม่ใช่ UTF-16 ก่อน SS2k16) และฟังก์ชั่นสตริงจะทำงานเฉพาะกับการเข้ารหัสนั้น BTW แล้วดัชนีล่ะ หากคุณต้องการเก็บข้อมูลโดยพลการคุณควรใช้เลขฐานสองแทน
Adriano Repetti

ใช่เพียงแค่แบ่งฟังก์ชั่นการค้นหาสตริง
Nishant

8
ดังนั้นคุณรู้ไหม ... มันไม่ได้ "ทำงาน" เช่นการจัดเก็บที่floatเป็นintและไป "ดีแน่ใจทศนิยมหายไป." ทำไม่ได้
user7116

70

ฉันมักจะใช้ nvarchar เพราะมันช่วยให้สิ่งที่ฉันกำลังสร้างสามารถทนต่อข้อมูลใด ๆ ที่ฉันโยนไปได้ ระบบ CMS ของฉันใช้ภาษาจีนโดยบังเอิญเพราะฉันใช้ nvarchar ทุกวันนี้แอปพลิเคชั่นใหม่ ๆ ไม่ควรกังวลเกี่ยวกับปริมาณเนื้อที่ที่ต้องการ


25
แนวคิดที่ว่าแอพใหม่ไม่ควรกังวลเกี่ยวกับข้อ จำกัด ด้านพื้นที่ค่อนข้างสั้นและทุกคนที่จัดการกับฐานข้อมูลในระดับองค์กรขนาดกลางถึงใหญ่จะยินดีที่จะบอกคุณว่าไม่ถูกต้องสมบูรณ์
Frater

60
เพื่อให้มีอิสระในการใส่คำพูดเข้าไปในปากของแท็กทู็กฉันคิดว่าข้อความที่แม่นยำมากขึ้นอาจเป็นไปได้ว่า 'ไม่น่าเป็นไปได้ที่แอพใหม่ใด ๆ จะต้องกังวลเกี่ยวกับพื้นที่ที่ต้องการมากกว่าที่ควรจะเป็นเรื่องสากล
Cowan

1
"ทุกวันนี้แอพใหม่ใด ๆ ไม่ควรกังวลเกี่ยวกับปริมาณเนื้อที่ที่ต้องการ" - ยกเว้นว่าคุณกำลังใช้ที่เก็บข้อมูลบนคลาวด์ฟรีที่ซึ่งแผนการชำระเงินจะเพิ่มขึ้นอย่างต่อเนื่องเป็น $ (ดูที่แผนการแชร์ของ AppHarbor SQL Server)
ganders

3
@ganders เสียงหอน! คุณอยู่ที่นั่น ข้อความทั่วไปนั้นถูกต้องชั่วคราวเท่านั้นที่ดีที่สุด การคำนวณเป็นเกมชิงช้าและวงเวียนแน่นอน ฉันกังวลอย่างมากกับปริมาณพื้นที่ที่ฉันใช้บน Windows Azure CCP ที่กล่าวว่าฉันจะ "ไม่" ใช้ varchar มากกว่า nvarchar Ooo ฉันไม่ได้ขัดแย้งกับตัวเองเหรอ?
rism

1
@rism ฉันเชื่อว่าคุณลบความเสี่ยงใด ๆ ที่ขัดแย้งกับการใช้คำพูดของคุณ"never"อย่างน้อยในทางเทคนิค
Smandoli

30

ขึ้นอยู่กับวิธีการติดตั้ง Oracle ในระหว่างกระบวนการติดตั้งตัวเลือก NLS_CHARACTERSET จะถูกตั้งค่า SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'คุณอาจจะสามารถที่จะหามันด้วยแบบสอบถาม

หาก NLS_CHARACTERSET ของคุณเป็นการเข้ารหัสแบบ Unicode เช่น UTF8 ยอดเยี่ยม การใช้ VARCHAR และ NVARCHAR นั้นเหมือนกันมาก หยุดอ่านเดี๋ยวนี้ไปเลย มิฉะนั้นหรือถ้าคุณไม่มีการควบคุมชุดอักขระของ Oracle ให้อ่านต่อ

VARCHAR - ข้อมูลถูกเก็บไว้ในการเข้ารหัส NLS_CHARACTERSET หากมีอินสแตนซ์ฐานข้อมูลอื่น ๆ บนเซิร์ฟเวอร์เดียวกันคุณอาจถูก จำกัด โดยพวกเขา และในทางกลับกันเนื่องจากคุณต้องแชร์การตั้งค่า ข้อมูลดังกล่าวสามารถจัดเก็บข้อมูลใด ๆ ที่สามารถเข้ารหัสโดยใช้ชุดตัวอักษรและไม่มีอะไรอื่น ตัวอย่างเช่นหากชุดอักขระคือ MS-1252 คุณสามารถเก็บอักขระเช่นตัวอักษรภาษาอังกฤษตัวอักษรเน้นเสียงจำนวนหนึ่งและอีกสองสามตัวอักษร (เช่น€และ -) แอปพลิเคชันของคุณจะมีประโยชน์กับสถานที่เพียงไม่กี่แห่งไม่สามารถทำงานได้ทุกที่ในโลก ด้วยเหตุนี้จึงถือเป็นแนวคิดที่ไม่ดี

NVARCHAR - ข้อมูลถูกเก็บไว้ในการเข้ารหัส Unicode รองรับทุกภาษา ความคิดที่ดี.

แล้วพื้นที่เก็บข้อมูลล่ะ VARCHAR นั้นมีประสิทธิภาพโดยทั่วไปเนื่องจากชุดอักขระ / การเข้ารหัสได้รับการออกแบบเองสำหรับสถานที่เฉพาะ เขตข้อมูล NVARCHAR เก็บไว้ในการเข้ารหัส UTF-8 หรือ UTF-16 โดยยึดตามการตั้งค่า NLS อย่างแดกดัน UTF-8 มีประสิทธิภาพมากสำหรับภาษา "ตะวันตก" ในขณะที่ยังรองรับภาษาเอเชีย UTF-16 มีประสิทธิภาพมากสำหรับภาษาเอเชียในขณะที่ยังรองรับภาษา "ตะวันตก" หากกังวลเกี่ยวกับพื้นที่เก็บข้อมูลให้เลือกการตั้งค่า NLS เพื่อให้ Oracle ใช้ UTF-8 หรือ UTF-16 ตามความเหมาะสม

แล้วความเร็วในการประมวลผลล่ะ? แพลตฟอร์มการเข้ารหัสใหม่ส่วนใหญ่ใช้ Unicode (Java, .NET, แม้แต่ c ++ std :: wstring จากปีที่แล้ว!) ดังนั้นถ้าฟิลด์ฐานข้อมูลคือ VARCHAR มันบังคับให้ Oracle แปลงระหว่างชุดอักขระในการอ่านหรือเขียนทุกครั้งซึ่งไม่ดี การใช้ NVARCHAR หลีกเลี่ยงการแปลง

บรรทัดล่างสุด: ใช้ NVARCHAR! มันหลีกเลี่ยงข้อ จำกัด และการพึ่งพาเป็นสิ่งที่ดีสำหรับพื้นที่จัดเก็บและมักจะดีที่สุดสำหรับประสิทธิภาพเช่นกัน


42
นี่เป็นคำตอบที่ดีมากยกเว้นคำถามนั้นเกี่ยวกับ sql-server
กระตุ้น

21

nvarchar เก็บข้อมูลเป็น Unicode ดังนั้นหากคุณกำลังจะจัดเก็บข้อมูลหลายภาษา (มากกว่าหนึ่งภาษา) ในคอลัมน์ข้อมูลคุณต้องมีตัวแปร N


16

สองเซ็นต์ของฉัน

  1. ดัชนีสามารถล้มเหลวเมื่อไม่ได้ใช้ประเภทข้อมูลที่ถูกต้อง:
    ใน SQL Server: เมื่อคุณมีดัชนีอยู่เหนือคอลัมน์ VARCHAR และแสดงเป็น Unicode String, SQL Server จะไม่ใช้ดัชนี สิ่งเดียวกันนี้เกิดขึ้นเมื่อคุณแสดง BigInt ไปยังคอลัมน์ที่จัดทำดัชนีซึ่งประกอบด้วย SmallInt แม้ว่า BigInt จะเล็กพอที่จะเป็น SmallInt, SQL Server จะไม่สามารถใช้ดัชนีได้ วิธีอื่นที่อยู่รอบตัวคุณไม่มีปัญหานี้ (เมื่อระบุ SmallInt หรือ Ansi-Code ให้กับคอลัมน์ BigInt ot NVARCHAR ที่จัดทำดัชนี)

  2. ประเภทข้อมูลอาจแตกต่างกันระหว่าง DBMS (ระบบการจัดการฐานข้อมูล)
    ที่แตกต่างกัน: รู้ว่าทุกฐานข้อมูลมีประเภทข้อมูลที่แตกต่างกันเล็กน้อยและ VARCHAR ไม่ได้มีความหมายเหมือนกันทุกที่ ในขณะที่ SQL Server มี VARCHAR และ NVARCHAR ฐานข้อมูล Apache / Derby มีเพียง VARCHAR และ VARCHAR นั้นอยู่ใน Unicode


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

14

ส่วนใหญ่nvarcharเก็บอักขระ Unicode และvarcharเก็บอักขระที่ไม่ใช่ Unicode

"Unicodes" หมายถึงรูปแบบการเข้ารหัสอักขระแบบ 16 บิตที่อนุญาตให้ตัวอักษรจากภาษาอื่น ๆ เช่นอารบิกฮิบรูจีนจีนญี่ปุ่นมาเข้ารหัสเป็นชุดอักขระเดียว

นั่นหมายความว่ายูนิโค้ดใช้ 2 ไบต์ต่ออักขระในการจัดเก็บและ nonunicodes ใช้เพียงหนึ่งไบต์ต่ออักขระในการจัดเก็บ ซึ่งหมายความว่ายูนิโค้ดต้องการความจุสองเท่าในการจัดเก็บเทียบกับที่ไม่ใช่ยูนิโคด


10

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


10

ฉันจะบอกว่ามันขึ้นอยู่กับ

หากคุณพัฒนาแอปพลิเคชันเดสก์ท็อปโดยที่ระบบปฏิบัติการทำงานใน Unicode (เช่นระบบ Windows ปัจจุบันทั้งหมด) และภาษานั้นสนับสนุน Unicode (สตริงเริ่มต้นคือ Unicode เช่นใน Java หรือ C #) ให้ไปที่ nvarchar

หากคุณพัฒนาเว็บแอปพลิเคชันโดยที่สตริงมาเป็น UTF-8 และภาษาคือ PHP ซึ่งยังไม่รองรับ Unicode (ในรุ่น 5.x), varchar อาจเป็นตัวเลือกที่ดีกว่า


9

แม้ว่าจะจัดNVARCHARเก็บ Unicode คุณควรพิจารณาด้วยความช่วยเหลือในการเปรียบเทียบนอกจากนี้คุณยังสามารถใช้VARCHARและบันทึกข้อมูลภาษาท้องถิ่นของคุณได้

แค่คิดสถานการณ์ต่อไปนี้

การเรียงฐานข้อมูลของคุณคือภาษาเปอร์เซียและคุณบันทึกค่าเช่น 'علی' (การเขียนภาษาเปอร์เซียของ Ali) ในVARCHAR(10)ประเภทข้อมูล ไม่มีปัญหาและ DBMS ใช้เพียงสามไบต์ในการจัดเก็บ

อย่างไรก็ตามหากคุณต้องการถ่ายโอนข้อมูลของคุณไปยังฐานข้อมูลอื่นและดูผลลัพธ์ที่ถูกต้องฐานข้อมูลปลายทางของคุณจะต้องมีการเปรียบเทียบเหมือนกับเป้าหมายซึ่งเป็นภาษาเปอร์เซียในตัวอย่างนี้

หากการเปรียบเทียบเป้าหมายของคุณแตกต่างคุณจะเห็นเครื่องหมายคำถาม (?) ในฐานข้อมูลเป้าหมาย

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

ฉันเชื่อว่าการออกแบบอาจแตกต่างกัน ขึ้นอยู่กับสภาพแวดล้อมที่คุณทำงาน


8

ฉันได้ดูที่คำตอบและหลายคนดูเหมือนจะแนะนำให้ใช้nvarcharมากกว่าvarcharเพราะพื้นที่ไม่ได้เป็นปัญหาอีกต่อไปดังนั้นจึงไม่มีอันตรายในการทำให้ Unicode สำหรับการจัดเก็บเพิ่มเล็กน้อย สิ่งนี้ไม่เป็นความจริงเสมอไปเมื่อคุณต้องการใช้ดัชนีกับคอลัมน์ของคุณ SQL Server มีขนาด จำกัด ที่ 900 ไบต์สำหรับขนาดของเขตข้อมูลที่คุณสามารถจัดทำดัชนี ดังนั้นถ้าคุณมีvarchar(900)คุณยังสามารถดัชนี varchar(901)แต่ไม่ ด้วยจำนวนตัวอักษรที่จะลดลงครึ่งหนึ่งเพื่อให้คุณสามารถจัดทำดัชนีขึ้นไปnvarchar nvarchar(450)ดังนั้นหากคุณมั่นใจว่าคุณไม่ต้องการnvarcharฉันไม่แนะนำให้ใช้

โดยทั่วไปแล้วในฐานข้อมูลฉันแนะนำให้ใช้ขนาดที่คุณต้องการเพราะคุณสามารถขยายได้เสมอ ตัวอย่างเช่นเพื่อนร่วมงานในที่ทำงานเคยคิดว่าไม่มีอันตรายใด ๆ ในการใช้nvarchar(max)งานคอลัมน์เนื่องจากเราไม่มีปัญหากับการจัดเก็บเลย ต่อมาเมื่อเราพยายามใช้ดัชนีเหนือคอลัมน์นี้ SQL Server จะปฏิเสธสิ่งนี้ อย่างไรก็ตามหากเขาเริ่มต้นด้วยแม้varchar(5)เราจะสามารถขยายได้ในภายหลังเพื่อสิ่งที่เราต้องการโดยไม่มีปัญหาดังกล่าวซึ่งจะทำให้เราต้องวางแผนการย้ายถิ่นเพื่อแก้ไขปัญหานี้


7

nVarchar จะช่วยคุณจัดเก็บอักขระ Unicode เป็นวิธีที่จะไปหากคุณต้องการจัดเก็บข้อมูลที่แปลเป็นภาษาท้องถิ่น


7

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

1252 ซึ่งเป็น Latin1 (ANSI) เป็นเรื่องธรรมดาที่สุด ชุดอักขระไบต์เดียวยังไม่เพียงพอสำหรับการจัดเก็บอักขระทั้งหมดที่ใช้โดยหลายภาษา ตัวอย่างเช่นบางภาษาในเอเชียมีอักขระหลายพันตัวดังนั้นจึงต้องใช้สองไบต์ต่ออักขระ

มาตรฐาน Unicode

เมื่อระบบที่ใช้โค้ดเพจหลายเพจถูกใช้ในเครือข่ายระบบจะจัดการการสื่อสารได้ยาก สิ่งที่เป็นมาตรฐานของ ISO และ Unicode สมาคมแนะนำUnicode Unicode ใช้สองไบต์เพื่อเก็บอักขระแต่ละตัว นั่นคือ 65,536 ตัวอักษรที่แตกต่างกันสามารถกำหนดดังนั้นตัวละครเกือบทั้งหมดสามารถครอบคลุมด้วย Unicode หากคอมพิวเตอร์สองเครื่องใช้ Unicode สัญลักษณ์ทั้งหมดจะถูกนำเสนอในลักษณะเดียวกันและไม่จำเป็นต้องมีการแปลงนี่เป็นแนวคิดเบื้องหลัง Unicode

SQL Server มีประเภทข้อมูลอักขระสองประเภท:

  • ไม่ใช่ Unicode (char, varchar และข้อความ)
  • Unicode (nchar, nvarchar และ ntext)

หากเราต้องการบันทึกข้อมูลตัวละครจากหลายประเทศให้ใช้ Unicode เสมอ


6

ผมต้องบอกว่าที่นี่ (ฉันรู้ว่าฉันอาจจะเปิดตัวเองขึ้นไปตำหนิครับ) แต่ก็เพียงครั้งเดียวเมื่อNVARCHARเป็นจริงมากขึ้นมีประโยชน์ (แจ้งให้ทราบล่วงหน้ามากขึ้นที่นั่น!) กว่าVARCHARคือเมื่อทุก collations ในทุก ของระบบที่ต้องพึ่งพาและภายในฐานข้อมูลนั้นเหมือนกัน ... ? หากไม่แล้วแปลงเปรียบเทียบมีที่จะเกิดขึ้นต่อไปและเพื่อให้ทำเช่นเดียวกับที่ทำงานได้เป็นVARCHARNVARCHAR

หากต้องการเพิ่มระบบฐานข้อมูลบางระบบเช่นSQL Server (ก่อนปี 2012)จะมีขนาดหน้าประมาณ 8K ดังนั้นหากคุณกำลังมองหาที่จัดเก็บข้อมูลที่ค้นหาได้ซึ่งไม่ได้อยู่ในรูปแบบTEXTหรือNTEXTเขตข้อมูลก็VARCHARจะให้พื้นที่ 8k เต็มในขณะที่NVARCHARให้ 4k เท่านั้น (เพิ่มเป็นสองเท่าคูณสองเท่าของพื้นที่ว่าง)

ฉันคิดว่าเพื่อสรุปการใช้อย่างใดอย่างหนึ่งขึ้นอยู่กับ:

  • โครงการหรือบริบท
  • โครงสร้างพื้นฐาน
  • ระบบฐานข้อมูล

6

ทำตามความแตกต่างระหว่างโปรแกรม Sql Server VARCHAR และ NVARCHAR ชนิดข้อมูล ที่นี่คุณสามารถเห็นได้อย่างชัดเจน

โดยทั่วไปแล้ว varchar เก็บข้อมูลเป็น Unicode ดังนั้นหากคุณกำลังจะจัดเก็บข้อมูลหลายภาษา (มากกว่าหนึ่งภาษา) ในคอลัมน์ข้อมูลคุณต้องมีตัวแปร N


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

ckuhn203 ฉันจะไม่บอกให้คุณเห็นอันนี้
Pradeep Kesharwani

6

ความแตกต่างที่สำคัญระหว่างVarchar(n)และnvarchar(n)คือ: ป้อนคำอธิบายรูปภาพที่นี่

Varchar(ความยาวผันแปรข้อมูลอักขระที่ไม่ใช่ Unicode) ขนาดไม่เกิน 8000 1. เป็นชนิดข้อมูลความยาวแปรผัน

  1. ใช้เพื่อเก็บอักขระที่ไม่ใช่ Unicode

  2. ตรงพื้นที่ 1 ไบต์สำหรับอักขระแต่ละตัว

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

Nvarchar: ข้อมูลอักขระ Unicode ความยาวผันแปรได้

1. เป็นประเภทข้อมูลที่มีความยาวผันแปรได้

2. ใช้เพื่อจัดเก็บอักขระ Unicode

  1. ข้อมูลถูกเก็บไว้ในการเข้ารหัส Unicode รองรับทุกภาษา (ตัวอย่างเช่นภาษาอาหรับ, เยอรมัน, ฮินดี, ฯลฯ )

6

Jeffrey L Whitledge ที่มีคะแนนชื่อเสียงประมาณ 47,000 คะแนนแนะนำให้ใช้ nvarchar

โซโลมอน Rutzky ด้วยคะแนนชื่อเสียง ~ 33200 แนะนำ: อย่าใช้ NVARCHAR เสมอ นั่นเป็นทัศนคติที่อันตรายและมักมีค่าใช้จ่ายสูง

อะไรคือความแตกต่างของประสิทธิภาพหลักระหว่างชนิดข้อมูล varchar และ nvarchar SQL Server?

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

ทั้งสองคนที่มีชื่อเสียงสูงนักพัฒนาฐานข้อมูลเซิร์ฟเวอร์ sql การเรียนรู้เลือกอะไร?

มีคำเตือนมากมายในคำตอบและความคิดเห็นเกี่ยวกับปัญหาด้านประสิทธิภาพหากคุณไม่สอดคล้องกับตัวเลือก

มีความคิดเห็น pro / con nvarchar เพื่อประสิทธิภาพ

มีข้อคิดเห็น pro / con varchar สำหรับประสิทธิภาพ

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

ฉันเลือก varchar เพื่อหลีกเลี่ยงการเข้าใกล้ขีด จำกัด ขนาดบันทึกตาราง 8060 ของ SQL * server 2012

การใช้ nvarchar สำหรับฉันเกินขีด จำกัด 8060 ไบต์นี้

ฉันยังคิดว่าฉันควรจับคู่ประเภทข้อมูลของตารางรหัสที่เกี่ยวข้องกับประเภทข้อมูลของตารางกลางหลัก

ฉันเคยเห็นการใช้งานคอลัมน์ varchar ที่สถานที่ทำงานนี้รัฐบาลออสเตรเลียใต้โดยนักพัฒนาฐานข้อมูลที่มีประสบการณ์ก่อนหน้านี้ซึ่งการนับจำนวนแถวของตารางจะเป็นจำนวนหลายล้านหรือมากกว่านั้น (และคอลัมน์ nvarchar น้อยมากถ้ามี) ตาราง) ดังนั้นปริมาณข้อมูลแถวที่คาดหวังอาจกลายเป็นส่วนหนึ่งของการตัดสินใจนี้


1

nvarcharมีความปลอดภัยในการใช้งานเมื่อเทียบกับvarcharเพื่อที่จะทำให้รหัสของเราปราศจากข้อผิดพลาด (ประเภทไม่ตรงกัน) เนื่องจากnvarcharอนุญาตให้มีอักขระแบบ Unicode เช่นกัน เมื่อเราใช้whereเงื่อนไขในการสืบค้น SQL Server และหากเราใช้=โอเปอเรเตอร์จะเกิดข้อผิดพลาดบางครั้ง เหตุผลที่เป็นไปได้สำหรับสิ่งนี้คือคอลัมน์การแมปของเราจะแตกต่างvarcharกัน หากเรากำหนดไว้ในnvarcharปัญหานี้ฉันจะไม่เกิดขึ้น เรายังคงยึดติดกับvarcharและหลีกเลี่ยงปัญหานี้เราดีขึ้นใช้คำสำคัญมากกว่าLIKE=

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