T-SQL deyimlerinde N önekinin anlamı nedir ve ne zaman kullanmalıyım?


352

Bazı insert T-SQL sorgularında önek N gördüm. Birçok kişi N, değeri bir tabloya eklemeden önce kullanmıştır .

Araştırdım, ancak Ntabloya herhangi bir dizgi eklemeden önce dahil etmenin amacının ne olduğunu anlayamadım .

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

Bu 'N' öneki hangi amaca hizmet eder ve ne zaman kullanılmalıdır?

Yanıtlar:


415

Dizeyi nvarcharveri türü olarak değil,varchar

Dizeleri N öneki kullanarak geçiren Transact-SQL kodu görmüş olabilirsiniz. Bu, sonraki dizenin Unicode'da olduğunu gösterir (N aslında Ulusal dil karakter kümesini temsil eder). Bu, CHAR, VARCHAR veya TEXT yerine NCHAR, NVARCHAR veya NTEXT değerini geçtiğiniz anlamına gelir.

Microsoft'tan alıntı yapmak için :

Önek Unicode karakter dizesi sabitleri N harfiyle sabitlenir. N öneki olmadan, dize veritabanının varsayılan kod sayfasına dönüştürülür. Bu varsayılan kod sayfası belirli karakterleri tanımayabilir .


Bu iki veri türü arasındaki farkı bilmek istiyorsanız, şu SO gönderisine bakın:

Varchar ve nvarchar arasındaki fark nedir?


1
@ Bu Nsadece aşağıdaki veri tiplerini kullanırken kullanmalıyım anlamına gelir CHAR, VARCHAR or TEXT? çünkü 'NCHAR, NVARCHAR veya NTEXT' doğal olarak UNICODE depolamak i ayrı ayrı eklemek gerekmez .... doğru mu?
Pritesh

@Pritesh - Yalnızca bu unicode karakterleri yukarıdaki kalın metinde olduğu gibi tanımayabilecek bir varsayılan kod sayfası kullanıyorsanız.
Todd

5
Bağlantıya @Curt databases aspfaq comson derece şüpheli web sitelerine yönlendirmeler ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), pornografi, zararlı sitelere ve spam URL'ler gibi kurumsal güvenlik duvarı tarafından işaretlendi hangi. Aspfaq.com sahibiyle bağlantı kurdum ve bağlantıyı kaldırmak için cevabı düzenledim.
jaume

21

Size N'önekle olan can sıkıcı bir şey söyleyeyim - iki gün boyunca düzeltemedim.

Veritabanı harmanlamam SQL_Latin1_General_CP1_CI_AS .

MyCol1 adlı bir sütuna sahip bir tablo var . Bu bir Nvarchar

Bu sorgu, Var Olan Tam Değer ile eşleşmiyor.

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

// 0 result

N '' önekinin kullanılması bunu düzeltir

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

// 1 result - found!!!!

Neden? Çünkü latin1_general büyük noktalı İ'ye sahip değil, bu yüzden sanırım başarısız oluyor.


8

1. Performans:

Nerede cümlenizin böyle olduğunu varsayın:

WHERE NAME='JON'

NAME sütunu nvarchar veya nchar dışında bir türdeyse, N önekini belirtmemelisiniz. Ancak, NAME sütunu nvarchar veya nchar türündeyse, N önekini belirtmezseniz, 'JON' unicode olmayan olarak kabul edilir. Bu, NAME sütununun ve 'JON' dizesinin veri türünün farklı olduğu ve dolayısıyla SQL Server'ın bir işlenenin türünü diğerine dolaylı olarak dönüştürdüğü anlamına gelir. SQL Server değişmezin türünü sütunun türüne dönüştürürse, sorun yoktur, ancak başka şekilde yaparsa, sütunun dizini (varsa) kullanılmayacağı için performans zarar görür.

2. Karakter seti:

Sütun nvarchar veya nchar türündeyse, WHERE ölçütleri / UPDATE / INSERT yan tümcesinde karakter dizesini belirtirken her zaman N önekini kullanın. Bunu yapmazsanız ve dizenizdeki karakterlerden biri unicode ise (uluslararası karakterler gibi - örnek - ā), başarısız olur veya veri bozulması yaşar.


4

Değerin nvarchar tipi olduğunu varsayarsak, sadece N kullanıyoruz ''

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.