Qual è il significato del prefisso N nelle istruzioni T-SQL e quando dovrei usarlo?


352

Ho visto il prefisso N in alcune query di inserimento T-SQL. Molte persone hanno usato Nprima di inserire il valore in una tabella.

Ho cercato, ma non sono stato in grado di capire quale sia lo scopo di includere il Nprima di inserire eventuali stringhe nella tabella.

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

A cosa serve questo prefisso 'N' e quando dovrebbe essere usato?

Risposte:


415

Dichiara la stringa come nvarchartipo di dati, piuttosto chevarchar

Potresti aver visto il codice Transact-SQL che passa le stringhe utilizzando un prefisso N. Ciò indica che la stringa successiva è in Unicode (la N sta per set di caratteri in lingua nazionale). Ciò significa che stai passando un valore NCHAR, NVARCHAR o NTEXT, al contrario di CHAR, VARCHAR o TEXT.

Per citare da Microsoft :

Prefisso Costante stringa di caratteri Unicode con la lettera N. Senza il prefisso N, la stringa viene convertita nella tabella codici predefinita del database. Questa tabella codici predefinita potrebbe non riconoscere alcuni caratteri .


Se vuoi conoscere la differenza tra questi due tipi di dati, vedi questo post SO:

Qual'è la differenza tra varchar e nvarchar?


1
@Curt significa che dovrei usare Nsolo quando sto usando i seguenti tipi di dati CHAR, VARCHAR or TEXT?? perché `NCHAR, NVARCHAR o NTEXT` sono intrinsecamente archiviati UNICODE non ho bisogno di aggiungerlo separatamente .... è vero?
Pritesh,

@Pritesh - Solo se stai utilizzando una tabella codici predefinita che potrebbe non riconoscere quei caratteri unicode come nel grassetto sopra.
Todd,

5
@Curt Il link per databases aspfaq comredirect a siti web estremamente dubbie ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), che sono stati segnati dal nostro firewall aziendale come pornografia, siti dannosi e URL di spam. Ho contattato il proprietario di aspfaq.com e modificato la risposta per rimuovere il collegamento.
Jaume,

21

Lascia che ti dica una cosa fastidiosa che è successa con il N'prefisso: non sono stato in grado di risolverlo per due giorni.

Le mie regole di confronto del database sono SQL_Latin1_General_CP1_CI_AS .

Ha una tabella con una colonna chiamata MyCol1 . È un Nvarchar

Questa query non corrisponde al valore esatto esistente.

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

// 0 result

usando il prefisso N '' lo risolve

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

// 1 result - found!!!!

Perché? Perché latin1_general non ha grandi punti, è per questo che suppongo fallisca.


8

1. Prestazioni:

Supponiamo che la clausola where sia così:

WHERE NAME='JON'

Se la colonna NAME è di qualsiasi tipo diverso da nvarchar o nchar, non è necessario specificare il prefisso N. Tuttavia, se la colonna NAME è di tipo nvarchar o nchar, se non si specifica il prefisso N, "JON" viene trattato come non unicode. Ciò significa che il tipo di dati della colonna NAME e la stringa 'JON' sono diversi e quindi SQL Server converte implicitamente il tipo di un operando nell'altro. Se SQL Server converte il tipo letterale nel tipo di colonna, non vi è alcun problema, ma in caso contrario le prestazioni ne risentiranno perché l'indice della colonna (se disponibile) non verrà utilizzato.

2. Set di caratteri:

Se la colonna è di tipo nvarchar o nchar, utilizzare sempre il prefisso N specificando la stringa di caratteri nella clausola WHERE criteri / UPDATE / INSERT. Se non lo fai e uno dei caratteri nella tua stringa è unicode (come i caratteri internazionali - esempio - ā), fallirà o subirà la corruzione dei dati.


4

Supponendo che il valore sia di tipo nvarchar solo per questo stiamo usando N ''

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.