ความหมายของคำนำหน้า N ในคำสั่ง T-SQL คืออะไรและควรใช้เมื่อใด


352

ฉันเคยเห็นคำนำหน้า N ในคิวรี T-SQL แบบแทรกบางตัว มีหลายคนที่ใช้Nก่อนที่จะแทรกค่าในตาราง

ฉันค้นหา แต่ฉันไม่สามารถเข้าใจจุดประสงค์ของการรวมNสตริงก่อนที่จะแทรกสตริงใด ๆ ลงในตารางได้

INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),

คำนำหน้า 'N' นี้มีจุดประสงค์อะไรให้บริการและควรใช้เมื่อใด

คำตอบ:


415

มันประกาศสตริงเป็นnvarcharชนิดข้อมูลแทนvarchar

คุณอาจเห็นรหัส Transact-SQL ที่ส่งผ่านสตริงโดยใช้คำนำหน้า N นี่หมายความว่าสตริงที่ตามมาอยู่ใน Unicode (N จริงหมายถึงชุดอักขระภาษาประจำชาติ) ซึ่งหมายความว่าคุณกำลังผ่านค่า NCHAR, NVARCHAR หรือ NTEXT ซึ่งตรงข้ามกับ CHAR, VARCHAR หรือ TEXT

อ้างจาก Microsoft :

คำนำหน้าสตริงอักขระ Unicode คงที่ด้วยตัวอักษร N โดยไม่มีคำนำหน้า N สตริงจะถูกแปลงเป็นหน้ารหัสเริ่มต้นของฐานข้อมูล หน้ารหัสเริ่มต้นนี้อาจจะไม่รู้จักตัวอักษรบางอย่าง


หากคุณต้องการทราบความแตกต่างระหว่างสองชนิดข้อมูลเหล่านี้ดูโพสต์ SO นี้:

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


1
@Curt นั่นหมายความว่าฉันจะใช้Nเฉพาะเมื่อฉันใช้ประเภทข้อมูลต่อไปนี้เท่านั้นCHAR, VARCHAR or TEXT? เพราะ `NCHAR, NVARCHAR หรือ NTEXT 'มีการจัดเก็บ UNICODE โดยธรรมชาติฉันไม่ต้องการเพิ่ม seperatly .... จริงหรือ?
Pritesh

@Pritesh - เฉพาะในกรณีที่คุณใช้หน้ารหัสเริ่มต้นซึ่งอาจไม่รู้จักอักขระ Unicode ดังกล่าวในรูปแบบตัวหนา
ทอดด์

5
@Curt เชื่อมโยงไปยังdatabases aspfaq comการเปลี่ยนเส้นทางไปยังเว็บไซต์ที่น่าสงสัยมาก ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com) ซึ่งได้รับการทำเครื่องหมายโดยไฟร์วอลล์ของ บริษัท ของเราเป็นสื่อลามกเว็บไซต์ที่เป็นอันตรายและ URL สแปม ฉันได้ติดต่อเจ้าของ aspfaq.com และแก้ไขคำตอบเพื่อลบลิงก์
jaume

21

ให้ฉันบอกสิ่งที่น่ารำคาญที่เกิดขึ้นกับN'คำนำหน้า - ฉันไม่สามารถแก้ไขได้สองวัน

เรียงฐานข้อมูลของฉันคือSQL_Latin1_General_CP1_CI_AS

มันมีตารางที่มีคอลัมน์ที่เรียกว่าMyCol1 มันเป็นNvarchar

แบบสอบถามนี้ไม่ตรงกับค่าที่แน่นอนที่มีอยู่

SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = 'ESKİ'  

// 0 result

ใช้คำนำหน้า N '' แก้ไข

SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = N'ESKİ'  

// 1 result - found!!!!

ทำไม? เพราะ latin1_general ไม่มีจุดใหญ่İนั่นเป็นเหตุผลว่าทำไมฉันจึงล้มเหลว


8

1. ประสิทธิภาพ:

สมมติว่าประโยคของคุณเป็นเช่นนี้:

WHERE NAME='JON'

หากคอลัมน์ NAME เป็นประเภทอื่นใดนอกจาก nvarchar หรือ nchar คุณไม่ควรระบุคำนำหน้า N อย่างไรก็ตามหากคอลัมน์ NAME เป็นประเภท nvarchar หรือ nchar ดังนั้นหากคุณไม่ได้ระบุคำนำหน้า N จะถือว่า 'JON' เป็น non-unicode ซึ่งหมายความว่าชนิดข้อมูลของคอลัมน์ NAME และสตริง 'JON' นั้นแตกต่างกันดังนั้น SQL Server จะแปลงประเภทของตัวถูกดำเนินการหนึ่งไปเป็นอีกประเภทโดยปริยาย ถ้า SQL Server แปลงชนิดของตัวอักษรเป็นชนิดของคอลัมน์แล้วจะไม่มีปัญหา แต่ถ้ามันทำอย่างอื่นประสิทธิภาพจะได้รับผลกระทบเนื่องจากดัชนีของคอลัมน์ (ถ้ามี) จะไม่ถูกใช้

2. ชุดตัวละคร:

หากคอลัมน์เป็นประเภท nvarchar หรือ nchar ให้ใช้คำนำหน้า N เสมอในขณะที่ระบุสตริงอักขระในประโยค WHERE / UPDATE / INSERT หากคุณไม่ทำเช่นนี้และอักขระตัวใดตัวหนึ่งในสตริงของคุณคือ Unicode (เช่นอักขระสากล - ตัวอย่าง - ā) มันจะล้มเหลวหรือได้รับความเสียหายของข้อมูล


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