¿Cuál es el significado del prefijo N en las instrucciones T-SQL y cuándo debo usarlo?

352

He visto el prefijo N en algunas consultas de inserción de T-SQL. Muchas personas lo han usado Nantes de insertar el valor en una tabla.

Busqué, pero no pude entender cuál es el propósito de incluir Nantes de insertar cadenas en la tabla.

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

¿Para qué sirve este prefijo 'N' y cuándo se debe usar?

Kartik Patel
fuente

Respuestas:

415

Está declarando la cadena como nvarchartipo de datos, en lugar devarchar

Es posible que haya visto el código Transact-SQL que pasa cadenas utilizando un prefijo N. Esto denota que la cadena posterior está en Unicode (la N en realidad significa juego de caracteres del idioma nacional). Lo que significa que está pasando un valor NCHAR, NVARCHAR o NTEXT, en lugar de CHAR, VARCHAR o TEXT.

Para citar de Microsoft :

Prefije las constantes de cadena de caracteres Unicode con la letra N. Sin el prefijo N, la cadena se convierte a la página de códigos predeterminada de la base de datos. Es posible que esta página de códigos predeterminada no reconozca ciertos caracteres .


Si desea saber la diferencia entre estos dos tipos de datos, consulte esta publicación SO:

¿Cuál es la diferencia entre varchar y nvarchar?

Brusco
fuente
1
@Curt eso significa que debo usar Nsolo cuando estoy usando los siguientes tipos de datos CHAR, VARCHAR or TEXT?? porque `NCHAR, NVARCHAR o NTEXT` son inherentemente almacenar UNICODE, no necesito agregarlo por separado ... ¿es cierto?
Pritesh
@Pritesh: solo si está utilizando una página de códigos predeterminada que puede no reconocer esos caracteres unicode como en el texto en negrita anterior.
Todd
55
@Curt El enlace a databases aspfaq comredirecciones a sitios web muy dudosas ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), que han sido marcados por nuestro firewall de la empresa como la pornografía, sitios maliciosos y URLs de spam. Me puse en contacto con el propietario de aspfaq.com y edité la respuesta para eliminar el enlace.
Jaume
21

Déjame decirte una cosa molesta que sucedió con el N'prefijo: no pude arreglarlo durante dos días.

La clasificación de mi base de datos es SQL_Latin1_General_CP1_CI_AS .

Tiene una tabla con una columna llamada MyCol1 . Es un nvarchar

Esta consulta no coincide con el valor exacto que existe.

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

// 0 result

usando el prefijo N '' lo arregla

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

// 1 result - found!!!!

¿Por qué? Porque latin1_general no tiene puntos grandes , por eso falla, supongo.

bh_earth0
fuente
8

1. Rendimiento:

Suponga que su cláusula where es así:

WHERE NAME='JON'

Si la columna NOMBRE es de cualquier tipo que no sea nvarchar o nchar, entonces no debe especificar el prefijo N. Sin embargo, si la columna NOMBRE es de tipo nvarchar o nchar, entonces si no especifica el prefijo N, entonces 'JON' se trata como no unicode. Esto significa que el tipo de datos de la columna NAME y la cadena 'JON' son diferentes y, por lo tanto, SQL Server convierte implícitamente el tipo de un operando al otro. Si el SQL Server convierte el tipo de literal al tipo de columna, entonces no hay problema, pero si lo hace de otra manera, el rendimiento se verá afectado porque el índice de la columna (si está disponible) no se usará.

2. Conjunto de caracteres:

Si la columna es de tipo nvarchar o nchar, utilice siempre el prefijo N al especificar la cadena de caracteres en la cláusula WHERE criterios / ACTUALIZACIÓN / INSERTAR. Si no hace esto y uno de los caracteres en su cadena es unicode (como caracteres internacionales - ejemplo - ā), entonces fallará o sufrirá corrupción de datos.

variable
fuente
4

Suponiendo que el valor es nvarchar type para eso solo estamos usando N ''

RickyRam
fuente