ความหมายคือnvarchar
อะไร
ความแตกต่างระหว่างคืออะไรchar
, nchar
, varchar
และnvarchar
ใน SQL Server?
ความหมายคือnvarchar
อะไร
ความแตกต่างระหว่างคืออะไรchar
, nchar
, varchar
และnvarchar
ใน SQL Server?
คำตอบ:
เพียงเพื่อล้าง ... หรือสรุป ...
nchar
และnvarchar
สามารถเก็บอักขระ Unicodeได้char
และไม่สามารถเก็บอักขระ Unicodeได้varchar
char
และnchar
มีความยาวคงที่ซึ่งจะสำรองพื้นที่เก็บข้อมูลสำหรับจำนวนอักขระที่คุณระบุแม้ว่าคุณจะไม่ใช้พื้นที่ทั้งหมดจนหมดvarchar
และnvarchar
มีความยาวผันแปรได้ซึ่งจะใช้พื้นที่ว่างสำหรับอักขระที่คุณจัดเก็บเท่านั้น มันจะไม่จัดเก็บข้อมูลสำรองเหมือนchar
nchar
หรือnchar
และnvarchar
จะใช้พื้นที่เก็บข้อมูลมากเป็นสองเท่าดังนั้นจึงควรใช้เฉพาะเมื่อคุณต้องการการสนับสนุนUnicode
n...
รุ่นใช้เวลาถึงสองเท่าของพื้นที่จัดเก็บมากเป็นคำตอบที่แสดงของฉัน
คำตอบทั้งหมดระบุว่าvarchar
เป็นไบต์เดียวnvarchar
คือไบต์คู่ ส่วนแรกของเรื่องนี้ขึ้นอยู่กับการเปรียบเทียบดังที่แสดงด้านล่าง
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');
SELECT C1,
C2,
LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T
ผลตอบแทน
โปรดทราบว่า华
และ国
ตัวละครก็ยังคงไม่ได้เป็นตัวแทนในรุ่นและถูกแทนที่ด้วยความเงียบVARCHAR
?
จริงๆแล้วยังไม่มีตัวอักษรจีนที่สามารถพิมพ์ซ้ำได้ด้วยไบต์เดียวในการเปรียบเทียบ อักขระไบต์เดียวเท่านั้นคือชุด ASCII แบบตะวันตกทั่วไป
ด้วยเหตุนี้จึงเป็นไปได้สำหรับการแทรกจากnvarchar(X)
คอลัมน์หนึ่งไปยังvarchar(X)
คอลัมน์ที่จะล้มเหลวด้วยข้อผิดพลาดการตัด (ที่ X หมายถึงตัวเลขที่เหมือนกันในทั้งสองกรณี)
SQL Server 2012 เพิ่ม SC (เสริม Character) UTF-16
เรียงว่าการสนับสนุน ในการเปรียบเทียบเหล่านี้nvarchar
อักขระเดี่ยวอาจใช้เวลา 2 หรือ 4 ไบต์
nchar และ char ใช้งานได้ดีในลักษณะเดียวกันเหมือนกับ nvarchar และ varchar ข้อแตกต่างระหว่างพวกเขาเพียงอย่างเดียวคือตัวอักษร nchar / nvarchar store Unicode (จำเป็นถ้าคุณต้องการใช้ชุดอักขระเพิ่มเติม) ในขณะที่ varchar ไม่
เนื่องจากอักขระ Unicode ต้องการพื้นที่จัดเก็บเพิ่มเติมเขตข้อมูล nchar / nvarchar จึงใช้พื้นที่มากเป็นสองเท่า (เช่นใน SQL Server รุ่นก่อนหน้าขนาดสูงสุดของเขตข้อมูล nvarchar คือ 4000)
เพียงเพิ่มบางสิ่งเพิ่มเติม: nchar - เพิ่มช่องว่างต่อท้ายไปยังข้อมูล nvarchar - ไม่เพิ่มช่องว่างต่อท้ายให้กับข้อมูล
ดังนั้นหากคุณจะกรองชุดข้อมูลของคุณด้วยฟิลด์ 'nchar' คุณอาจต้องการใช้ RTRIM เพื่อลบช่องว่าง เช่นเขตข้อมูล nchar (10) ที่ชื่อว่า BRAND เก็บคำว่า NIKE มันเพิ่ม 6 ช่องว่างทางด้านขวาของคำว่า ดังนั้นเมื่อทำการกรองนิพจน์ควรอ่านได้: RTRIM (Fields! BRAND.Value) = "NIKE"
หวังว่าสิ่งนี้จะช่วยให้ใครบางคนที่นั่นเพราะฉันกำลังดิ้นรนกับมันสักพักแล้ว!
ความพยายามของฉันที่จะสรุปและแก้ไขคำตอบที่มีอยู่:
ก่อนchar
และnchar
จะใช้พื้นที่เก็บข้อมูลจำนวนคงที่เสมอแม้ว่าสตริงที่จะจัดเก็บจะมีขนาดเล็กกว่าพื้นที่ว่างในขณะที่varchar
และnvarchar
จะใช้พื้นที่เก็บข้อมูลเท่าที่จำเป็นในการจัดเก็บสตริงนั้น (บวกสองไบต์ของค่าใช้จ่าย) น่าจะเป็นที่เก็บความยาวสตริง) ดังนั้นโปรดจำไว้ว่า "var" หมายถึง "ตัวแปร" ดังเช่นในพื้นที่ตัวแปร
จุดที่สองที่สำคัญที่จะเข้าใจได้ว่าnchar
และnvarchar
สตริงร้านใช้ว่าสองไบต์ต่อตัวละครในขณะที่char
และvarchar
ใช้การเข้ารหัสที่กำหนดโดยการเปรียบเทียบหน้ารหัสซึ่งจะมักจะตรงหนึ่งไบต์ต่อตัวอักษร (แม้ว่าจะมีข้อยกเว้นดูด้านล่าง) ด้วยการใช้สองไบต์ต่อตัวอักษรสามารถจัดเก็บอักขระที่หลากหลายได้ดังนั้นสิ่งสำคัญที่ต้องจำที่นี่คือสิ่งนั้นnchar
และnvarchar
มีแนวโน้มที่จะเป็นทางเลือกที่ดีกว่ามากเมื่อคุณต้องการการสนับสนุนที่เป็นสากล
ตอนนี้สำหรับบางคะแนนปลีกย่อย
ก่อนอื่นnchar
และnvarchar
คอลัมน์จะเก็บข้อมูลโดยใช้ UCS-2 เสมอ ซึ่งหมายความว่าจะใช้สองไบต์ต่อตัวอักขระอย่างแน่นอนและอักขระ Unicode ใด ๆ ใน Basic Multilingual Plane (BMP) สามารถจัดเก็บโดยฟิลด์nchar
หรือ nvarchar
อย่างไรก็ตามไม่ใช่กรณีที่อักขระ Unicode ใด ๆสามารถจัดเก็บได้ ตัวอย่างเช่นตาม Wikipedia รหัสคะแนนสำหรับอักษรอียิปต์โบราณตกอยู่นอก BMP ดังนั้นจึงมีสตริง Unicode ที่สามารถแสดงใน UTF-8 และการเข้ารหัส Unicode จริงอื่น ๆ ที่ไม่สามารถเก็บไว้ใน SQL Server nchar
หรือnvarchar
เขตข้อมูลและสตริงที่เขียนด้วยอักษรอียิปต์โบราณจะอยู่ในหมู่พวกเขา โชคดีที่ผู้ใช้ของคุณอาจไม่ได้เขียนสคริปต์ แต่ก็เป็นสิ่งที่ควรคำนึงถึง!
อีกจุดที่น่าสับสน แต่น่าสนใจที่ผู้โพสต์คนอื่นได้เน้นไว้คือchar
และvarchar
ฟิลด์อาจใช้สองไบต์ต่อตัวอักษรสำหรับอักขระบางตัวหากหน้ารหัสตรวจทานต้องการ (มาร์ตินสมิ ธ แสดงตัวอย่างที่ยอดเยี่ยมซึ่งเขาแสดงให้เห็นว่า Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS แสดงพฤติกรรมนี้อย่างไรลองดูสิ)
ปรับปรุง:ณ SQL Server 2012 มีหน้ารหัสสุดท้ายสำหรับ UTF-16ตัวอย่างเช่น Latin1_General_100_CI_AS_SC ซึ่งสามารถครอบคลุมช่วง Unicode ทั้งหมดอย่างแท้จริง
char
: ข้อมูลตัวอักษรความยาวคงที่ที่มีความยาวสูงสุด 8000 ตัวอักษรnchar
: ข้อมูลยูนิโคดที่มีความยาวคงที่ที่มีความยาวสูงสุด 4,000 อักขระChar
= ความยาว 8 บิตNChar
= ความยาว 16 บิตchar
ไม่สามารถมีความยาว 8 บิต ไม่จำเป็นต้องเก็บความยาวและความยาวคงที่สามารถมีได้สูงสุด 8000 ตัวอักษร
nchar[(n)]
(ตัวละครประจำชาติ)
n
กำหนดความยาวสตริงและต้องเป็นค่าตั้งแต่ 1 ถึง 4,000n
ไบต์nvarchar [(n | max)]
(ตัวละครประจำชาติแตกต่างกันไป)
n
กำหนดความยาวสตริงและสามารถเป็นค่าตั้งแต่ 1 ถึง 4,000max
ระบุว่าขนาดหน่วยเก็บข้อมูลสูงสุดคือ 2 ^ 31-1 ไบต์ (2 GB)char [(n)]
(ตัวอักษร)
non-Unicode
ข้อมูลสตริงที่มีความยาวคงที่n
กำหนดความยาวสตริงและต้องเป็นค่าตั้งแต่ 1 ถึง 8,000n
ไบต์varchar [(n | max)]
(ตัวละครแตกต่างกันไป)
n
กำหนดความยาวสตริงและสามารถเป็นค่าตั้งแต่ 1 ถึง 8,000max
ระบุว่าขนาดหน่วยเก็บข้อมูลสูงสุดคือ 2 ^ 31-1 ไบต์ (2 GB)ความแตกต่างคือ:
ความแตกต่างก็คือความยาว ทั้ง nchar และ nvarchar สามารถยาวได้สูงสุด 4,000 อักขระ และอักขระ char และ varchar มีความยาวสูงสุด 8000 อักขระ แต่สำหรับ SQL Server คุณสามารถใช้ [n] varchar (สูงสุด) ซึ่งสามารถจัดการได้สูงสุด 2,147,483,648 อักขระ (สองกิกะไบต์ซึ่งเป็นจำนวนเต็ม 4 ไบต์ที่ลงชื่อ)
nchar ต้องการพื้นที่มากกว่า nvarchar
เช่น,
nchar (100) จะเก็บ 100 ตัวอักษรเสมอแม้ว่าคุณจะใส่เพียง 5 ตัวอักษรที่เหลือ 95 ตัวอักษรจะเต็มไปด้วยช่องว่าง การจัดเก็บ 5 ตัวอักษรใน nvarchar (100) จะบันทึก 5 ตัวอักษร
nchar (10) เป็นสตริง Unicode ที่มีความยาวคงที่ที่มีความยาว 10 nvarchar (10) เป็นสตริง Unicode ที่มีความยาวผันแปรได้และมีความยาวสูงสุด 10 โดยทั่วไปคุณจะใช้ค่าเดิมหากค่าข้อมูลทั้งหมดคือ 10 ตัวอักษรและหลัง ถ้าความยาวแตกต่างกันไป
nchar มีความยาวคงที่และสามารถเก็บอักขระ Unicode ได้ มันใช้ที่เก็บข้อมูลสองไบต์ต่ออักขระ
varchar มีความยาวผันแปรได้และไม่สามารถถืออักขระ Unicode ได้ มันใช้หนึ่งหน่วยเก็บข้อมูลไบต์ต่อตัวละคร
UCS-2
(ที่เกิดขึ้นจะเข้ารหัสที่ใช้โดย SQL Server) เก็บทุกตัวอักษรในตรงไบต์ที่สองดูmsdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspxSQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
: SQL Server 2008 สามารถใช้การบีบอัด SCSU แต่ยังคงการบีบอัดของสายอักขระ Unicode ที่เข้ารหัส UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspx
NVARCHARสามารถเก็บอักขระ Unicode และใช้เวลา 2 ไบต์ต่ออักขระ
nvarchar
ใช้เวลา 2 ไบต์ต่อตัวอักษรเสมอ