Apa arti dari awalan N dalam pernyataan T-SQL dan kapan saya harus menggunakannya?

352

Saya telah melihat awalan N di beberapa permintaan memasukkan T-SQL. Banyak orang telah menggunakan Nsebelum memasukkan nilai dalam tabel.

Saya mencari, tetapi saya tidak dapat memahami apa tujuan Nmemasukkan sebelum memasukkan string ke dalam tabel.

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

Apa tujuan awalan 'N' ini berfungsi, dan kapan harus digunakan?

Kartik Patel
sumber

Jawaban:

415

Ini mendeklarasikan string sebagai nvarchartipe data, bukanvarchar

Anda mungkin telah melihat kode Transact-SQL yang meneruskan string menggunakan awalan N. Ini menunjukkan bahwa string selanjutnya dalam Unicode (N sebenarnya adalah singkatan dari set karakter bahasa Nasional). Yang berarti Anda melewati nilai NCHAR, NVARCHAR atau NTEXT, sebagai lawan dari CHAR, VARCHAR, atau TEXT.

Mengutip dari Microsoft :

Awalan konstanta karakter Unicode dengan huruf N. Tanpa awalan N, string dikonversi ke halaman kode default dari database. Halaman kode default ini mungkin tidak mengenali karakter tertentu .


Jika Anda ingin mengetahui perbedaan antara kedua tipe data ini, lihat posting SO ini:

Apa perbedaan antara varchar dan nvarchar?

Singkat
sumber
1
@Curt Itu berarti saya shuld Nhanya menggunakan ketika saya menggunakan tipe data berikut CHAR, VARCHAR or TEXT?? karena `NCHAR, NVARCHAR atau NTEXT` secara inheren menyimpan UNICODE saya tidak perlu menambahkannya secara terpisah .... apakah itu benar?
Pritesh
@Pritesh - Hanya jika Anda menggunakan halaman kode default yang mungkin tidak mengenali karakter unicode seperti dalam teks tebal di atas.
Todd
5
@Curt Link ke databases aspfaq compengalihan ke situs web sangat meragukan ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), yang telah ditandai oleh firewall perusahaan kami sebagai pornografi, situs berbahaya dan URL spam. Saya telah menghubungi pemilik aspfaq.com dan mengedit jawaban untuk menghapus tautan.
jaume
21

Biarkan saya memberi tahu Anda hal yang menjengkelkan yang terjadi dengan N'awalan - Saya tidak dapat memperbaikinya selama dua hari.

Kumpulan basis data saya adalah SQL_Latin1_General_CP1_CI_AS .

Ini memiliki tabel dengan kolom yang disebut MyCol1 . Itu adalah Nvarchar

Kueri ini tidak cocok dengan Nilai Tepat yang Ada.

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

// 0 result

menggunakan awalan N 'memperbaikinya

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

// 1 result - found!!!!

Mengapa? Karena latin1_general tidak memiliki titik-titik besar İ itu sebabnya saya gagal.

bh_earth0
sumber
8

1. Kinerja:

Asumsikan klausa Anda di mana seperti ini:

WHERE NAME='JON'

Jika kolom NAME adalah tipe apa pun selain nvarchar atau nchar, maka Anda tidak harus menentukan awalan N. Namun, jika kolom NAME bertipe nvarchar atau nchar, maka jika Anda tidak menentukan awalan N, maka 'JON' diperlakukan sebagai non-unicode. Ini berarti tipe data kolom NAME dan string 'JON' berbeda sehingga SQL Server secara implisit mengubah tipe satu operan ke yang lainnya. Jika SQL Server mengubah tipe literal ke tipe kolom maka tidak ada masalah, tetapi jika itu sebaliknya, kinerja akan terluka karena indeks kolom (jika tersedia) tidak akan digunakan.

2. Set karakter:

Jika kolom bertipe nvarchar atau nchar, maka selalu gunakan awalan N saat menentukan string karakter dalam klausa WHERE criteria / UPDATE / INSERT. Jika Anda tidak melakukan ini dan salah satu karakter dalam string Anda adalah unicode (seperti karakter internasional - contoh - ā) maka itu akan gagal atau mengalami kerusakan data.

variabel
sumber
4

Dengan asumsi nilainya adalah tipe nvarchar untuk itu hanya kita yang menggunakan N ''

RickyRam
sumber