N prefisso prima della stringa nella query Transact-SQL


41

Mi diresti, per favore, quando dovrei usare il prefisso N prima della stringa nella query Transact-SQL? Ho iniziato a lavorare con un database in cui non ottengo risultati usando query come questa

SELECT * FROM a_table WHERE a_field LIKE '%а_pattern%'

fino a quando cambio modello in N'%а_pattern%'. Non ho mai dovuto aggiungere questo prefisso in passato, quindi sono curioso. a_fieldè definito come nvarchar(255), ma penso che la ragione sia qualcos'altro.

Risposte:


31

I seguenti articoli contengono alcune buone informazioni sulla domanda. La risposta breve è solo che c'è una mancata corrispondenza del tipo tra la colonna unicode e la stringa non unicode che stai usando. Dall'articolo di KB, sembra che l'omissione del prefisso N potrebbe ancora funzionare in alcuni casi, ma dipenderà dalla tabella codici e dalle impostazioni di confronto del database. Ciò potrebbe spiegare il cambiamento nel comportamento, se in precedenza avessi avuto successo con il metodo senza prefisso.

https://support.microsoft.com/en-us/kb/239530


6

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. Vedere l'articolo n. 2354 per un confronto di questi tipi di dati.

Unicode viene in genere utilizzato nelle applicazioni di database progettate per facilitare le code page che si estendono oltre le code page inglesi e dell'Europa occidentale, ad esempio il cinese. Unicode è progettato in modo che i set di caratteri estesi possano ancora "adattarsi" alle colonne del database.


3

Penso che il prefisso N indichi al server sql di trattare la stringa come un valore unicode. Le colonne nvarchar sono unicode, pertanto è necessario utilizzare questa sintassi quando si accede a queste colonne.

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.