Ý nghĩa của tiền tố N trong các câu lệnh T-SQL và khi nào tôi nên sử dụng nó?


352

Tôi đã thấy tiền tố N trong một số truy vấn T-SQL chèn. Nhiều người đã sử dụng Ntrước khi chèn giá trị vào bảng.

Tôi đã tìm kiếm, nhưng tôi không thể hiểu mục đích của việc bao gồm N trước khi chèn bất kỳ chuỗi nào vào bảng.

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

Mục đích của tiền tố 'N' này phục vụ cho mục đích gì và khi nào nên sử dụng nó?

Câu trả lời:


415

Đó là khai báo chuỗi dưới nvarchardạng kiểu dữ liệu, thay vìvarchar

Bạn có thể đã thấy mã Transact-SQL chuyển các chuỗi xung quanh bằng cách sử dụng tiền tố N. Điều này biểu thị rằng chuỗi tiếp theo là bằng Unicode (N thực sự là viết tắt của bộ ký tự ngôn ngữ quốc gia). Điều đó có nghĩa là bạn đang chuyển một giá trị NCHAR, NVARCHAR hoặc NTEXT, trái ngược với CHAR, VARCHAR hoặc TEXT.

Để trích dẫn từ Microsoft :

Tiền tố chuỗi ký tự Unicode với ký tự N. Không có tiền tố N, chuỗi được chuyển đổi sang trang mã mặc định của cơ sở dữ liệu. Trang mã mặc định này có thể không nhận ra các ký tự nhất định .


Nếu bạn muốn biết sự khác biệt giữa hai loại dữ liệu này, hãy xem bài đăng SO này:

Sự khác biệt giữa varchar và nvarchar là gì?


1
@Curt có nghĩa là tôi Nchỉ sử dụng khi tôi đang sử dụng các kiểu dữ liệu sau CHAR, VARCHAR or TEXT?? bởi vì `NCHAR, NVARCHAR hoặc NTEXT` vốn lưu trữ UNICODE nên tôi không cần phải thêm nó một cách riêng biệt .... điều đó có đúng không?
Pritesh

@Pritesh - Chỉ khi bạn đang sử dụng một trang mã mặc định có thể không nhận ra các ký tự unicode đó như trong văn bản in đậm ở trên.
Todd

5
@Curt Các liên kết đến databases aspfaq comtrang đổi hướng đến các trang web cực kỳ mơ hồ ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), đã được đánh dấu bằng tường lửa của công ty chúng tôi như khiêu dâm, các trang web độc hại và URL thư rác. Tôi đã liên hệ với chủ sở hữu aspfaq.com và chỉnh sửa câu trả lời để xóa liên kết.
jaume

21

Hãy để tôi nói cho bạn một điều khó chịu xảy ra với N'tiền tố - tôi đã không thể sửa nó trong hai ngày.

Đối chiếu cơ sở dữ liệu của tôi là SQL_Latin1_General_CP1_CI_AS .

Nó có một bảng với một cột được gọi là MyCol1 . Nó là một người Nvarchar

Truy vấn này không khớp với Giá trị Chính xác Tồn tại.

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

// 0 result

sử dụng tiền tố N '' sửa nó

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

// 1 result - found!!!!

Tại sao? Bởi vì latin1_general không có dấu chấm lớn. Đó là lý do tại sao tôi thất bại.


8

1. Hiệu suất:

Giả sử mệnh đề where của bạn giống như thế này:

WHERE NAME='JON'

Nếu cột NAME thuộc bất kỳ loại nào khác ngoài nvarchar hoặc nchar, thì bạn không nên chỉ định tiền tố N. Tuy nhiên, nếu cột NAME thuộc loại nvarchar hoặc nchar, thì nếu bạn không chỉ định tiền tố N, thì 'JON' được coi là không unicode. Điều này có nghĩa là kiểu dữ liệu của cột NAME và chuỗi 'JON' khác nhau và do đó, SQL Server hoàn toàn chuyển đổi loại toán hạng này sang loại khác. Nếu Máy chủ SQL chuyển đổi loại chữ thành loại của cột thì không có vấn đề gì, nhưng nếu nó làm theo cách khác thì hiệu suất sẽ bị tổn thương vì chỉ mục của cột (nếu có) sẽ không được sử dụng.

2. Bộ ký tự:

Nếu cột có kiểu nvarchar hoặc nchar, thì luôn luôn sử dụng tiền tố N trong khi chỉ định chuỗi ký tự trong mệnh đề WHEREiteria / UPDATE / INSERT. Nếu bạn không làm điều này và một trong các ký tự trong chuỗi của bạn là unicode (như ký tự quốc tế - ví dụ - ā) thì nó sẽ thất bại hoặc bị hỏng dữ liệu.


4

Giả sử giá trị là loại nvarchar cho rằng chỉ có chúng tôi đang sử dụng N ''

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.