เขียนความแตกต่างระหว่าง varchar และ nvarchar


59

ขณะนี้อยู่ในฐานข้อมูลของเรา SQL Server 2012, เรากำลังใช้และเราต้องการที่จะเปลี่ยนที่varchar nvarcharฉันสร้างสคริปต์ขึ้นมาแล้ว

คำถามของฉันมีความแตกต่างในวิธี SQL Server เขียนไปยังvarcharคอลัมน์กับnvarcharคอลัมน์? เรามีขั้นตอนการแบ็กเอนด์ที่ฉันกังวล

แก้ไข:
ไม่แน่ใจว่าสิ่งนี้ช่วยได้หรือไม่ แต่คอลัมน์ไม่มีดัชนี, f / k หรือข้อ จำกัด


คำตอบ:


46

คุณต้องแน่ใจว่าคุณใส่ตัวอักษรสตริง Unicode ด้วยคำนำหน้า N ตัวอย่างเช่นสิ่งเหล่านี้จะทำงานแตกต่างกันหากประเภทข้อมูลที่สำคัญคือNVARCHAR:

CREATE TABLE dbo.t(c NVARCHAR(32));

INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';

SELECT c FROM dbo.t;

SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';

ผล:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?

c
----
រៀន

สำหรับผู้ใช้บนอุปกรณ์พกพาหรือเบราว์เซอร์ที่แสดงอักขระกล่องแทนอักขระ Unicode จริงนี่คือรูปแบบ:

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


37

ข้อกังวลที่ยิ่งใหญ่ที่สุดคือการnvarcharใช้ 2 ไบต์ต่อตัวอักษรในขณะที่varcharใช้ 1 ดังนั้นnvarchar(4000)ใช้พื้นที่เก็บข้อมูลจำนวนเท่าvarchar(8000)*

นอกเหนือจากข้อมูลตัวละครทั้งหมดของคุณที่ต้องการพื้นที่เก็บข้อมูลมากเป็นสองเท่านี่ยังหมายถึง:

  • คุณอาจต้องใช้nvarcharคอลัมน์ที่สั้นกว่าเพื่อให้แถวอยู่ในข้อ จำกัด ของแถว 8060 ไบต์ / จำกัด จำนวนคอลัมน์ของอักขระ 8000 ตัว
  • หากคุณใช้nvarchar(max)คอลัมน์พวกเขาจะถูกผลักออกจากแถวเร็วกว่าที่varchar(max)คิด
  • คุณอาจต้องใช้nvarcharคอลัมน์ที่สั้นกว่าเพื่ออยู่ภายในวงเงินคีย์ดัชนี 900 ไบต์ (ฉันไม่รู้ว่าทำไมคุณต้องการใช้คีย์ดัชนีขนาดใหญ่เช่นนี้ แต่คุณไม่เคยรู้)

นอกจากนั้นการทำงานกับnvarcharไม่แตกต่างกันมากนักโดยสมมติว่าซอฟต์แวร์ไคลเอ็นต์ของคุณสร้างขึ้นเพื่อจัดการ Unicode SQL Server จะแปลง a varcharไปเป็นโปร่งใสnvarcharคุณจึงไม่จำเป็นต้องใช้คำนำหน้า N สำหรับตัวอักษรสตริงยกเว้นว่าคุณใช้อักขระ 2 ไบต์ (เช่น Unicode) ในตัวอักษร โปรดทราบว่าการคัดเลือกนักแสดงnvarcharเพื่อให้ได้varbinaryผลลัพธ์ที่แตกต่างจากการทำแบบเดียวกันvarcharนั้น จุดสำคัญคือคุณไม่ต้องเปลี่ยนค่า varchar ทุกตัวเป็นตัวอักษร nvarchar ทันทีเพื่อให้แอปพลิเคชันทำงานต่อไปซึ่งจะช่วยให้กระบวนการง่ายขึ้น

* ถ้าคุณใช้การบีบอัดข้อมูล (การบีบอัดแถวน้ำหนักเบาก็พอ Enterprise Edition ที่จำเป็นก่อนที่จะ SQL Server 2016 SP1 ) คุณจะมักจะพบncharและnvarcharใช้เวลาไม่พื้นที่มากขึ้นกว่าcharและvarcharเนื่องจากการบีบอัด Unicode (โดยใช้อัลกอริทึม SCSU)


17

คิดว่าต่อไปนี้เป็นข้อแตกต่างที่สำคัญ:

  1. Nvarchar เก็บข้อมูล UNICODE หากคุณมีข้อกำหนดในการเก็บข้อมูล UNICODE หรือข้อมูลหลายภาษา nvarchar เป็นตัวเลือก Varchar เก็บข้อมูล ASCII และควรเป็นประเภทข้อมูลที่คุณเลือกสำหรับการใช้งานปกติ
  2. เกี่ยวกับการใช้หน่วยความจำ nvarchar ใช้ 2 ไบต์ต่อตัวอักษรในขณะที่ varchar ใช้ 1
  3. การเข้าร่วม VARCHAR ไปยัง NVARCHAR นั้นได้รับความนิยมอย่างมาก
  4. อาจต้องการคำนำหน้า N เมื่อแทรกข้อมูล: INSERT dbo.t (c) เลือกN'ʤʥʦʧʨ ';
  5. ผู้เชี่ยวชาญบางคนแนะนำ nvarchar เสมอเพราะ: เนื่องจากระบบปฏิบัติการและแพลตฟอร์มการพัฒนาที่ทันสมัยทั้งหมดใช้ Unicode ภายในการใช้ nvarchar แทนที่จะเป็น varchar จะหลีกเลี่ยงการเข้ารหัสการแปลงทุกครั้งที่คุณอ่านหรือเขียนลงในฐานข้อมูล

0

จำเป็นต้องใช้ nvarchar สำหรับการจำลองแบบ RDP ผสานจาก Mobile DB ไปยัง SQL Server 2005 นอกจากนี้ LTrim (), RTrim () & Trim () ถูกใช้งานมาก bc nvarchar ไม่ตัดโดยอัตโนมัติ () จากช่องว่างจากการป้อนข้อมูลในขณะที่ Varchar ทำ .

ฉันไม่ทราบว่ามีการเปลี่ยนแปลงในปีที่ผ่านมาหรือไม่ แต่ตอนนี้ nvarchar เป็นมาตรฐานที่ใช้สำหรับการเข้าสู่ระบบเว็บไซต์สมาชิก NET Simple Membership บน VS Pro 2017 ที่ใช้ในฐานข้อมูลที่สร้างขึ้น


-3

หากคุณใช้ NVarchar บน Varchar และคุณไม่มีความต้องการที่จะสนับสนุน MULTI-LINQUAL คุณจะต้องเพิ่มพื้นที่เก็บข้อมูลสำหรับฐานข้อมูลสำรอง (ในพื้นที่และนอกสถานที่) ฐานข้อมูลที่ทันสมัยควรสนับสนุนทั้งสองอย่างและยอดนิยมในการแปลงใด ๆ ควรได้รับการพิจารณาในการออกแบบ

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