Qual é o significado do prefixo N nas instruções T-SQL e quando devo usá-lo?

352

Eu vi o prefixo N em algumas consultas T-SQL de inserção. Muitas pessoas já usaram Nantes de inserir o valor em uma tabela.

Eu procurei, mas não consegui entender qual é o objetivo de incluir o Nantes de inserir qualquer sequência na tabela.

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

Para que finalidade esse prefixo 'N' serve e quando deve ser usado?

Kartik Patel
fonte

Respostas:

415

Ele está declarando a string como nvarchartipo de dados, em vez devarchar

Você pode ter visto o código Transact-SQL que transmite cadeias de caracteres usando um prefixo N. Isso indica que a seqüência subsequente está em Unicode (o N realmente significa conjunto de caracteres do idioma nacional). O que significa que você está passando um valor NCHAR, NVARCHAR ou NTEXT, em oposição a CHAR, VARCHAR ou TEXT.

Para citar a Microsoft :

Prefixo constantes da cadeia de caracteres Unicode com a letra N. Sem o prefixo N, a cadeia é convertida na página de códigos padrão do banco de dados. Esta página de código padrão pode não reconhecer certos caracteres .


Se você quiser saber a diferença entre esses dois tipos de dados, consulte esta postagem do SO:

Qual é a diferença entre varchar e nvarchar?

Curt
fonte
11
@ Cortes que significa que eu deveria usar Napenas quando estou usando os seguintes tipos de dados CHAR, VARCHAR or TEXT? porque `NCHAR, NVARCHAR ou NTEXT` são inerentemente UNICODE de armazenamento, não preciso adicioná-lo separadamente .... isso é verdade?
Pritesh
@Pritesh - Somente se você estiver utilizando uma página de código padrão que talvez não reconheça esses caracteres unicode como no texto em negrito acima.
Todd
5
@Curt O link para databases aspfaq comredirecionamentos a sites extremamente duvidosos ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), que têm sido marcados por nosso firewall corporativo como pornografia, sites maliciosos e URLs de spam. Entrei em contato com o proprietário do aspfaq.com e editei a resposta para remover o link.
precisa
21

Deixe-me dizer uma coisa irritante que aconteceu com o N'prefixo - não consegui consertá-lo por dois dias.

Meu agrupamento de banco de dados é SQL_Latin1_General_CP1_CI_AS .

Possui uma tabela com uma coluna chamada MyCol1 . É um Nvarchar

Esta consulta falha ao corresponder ao valor exato que existe.

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

// 0 result

usando o prefixo N '' corrige

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

// 1 result - found!!!!

Por quê? Porque latin1_general não tem grandes pontilhadas © é por isso que falho, suponho.

bh_earth0
fonte
8

1. Desempenho:

Suponha que sua cláusula where seja assim:

WHERE NAME='JON'

Se a coluna NAME for de outro tipo que não nvarchar ou nchar, você não deverá especificar o prefixo N. No entanto, se a coluna NAME for do tipo nvarchar ou nchar, se você não especificar o prefixo N, 'JON' será tratado como não unicode. Isso significa que o tipo de dados da coluna NAME e a sequência 'JON' são diferentes e, portanto, o SQL Server converte implicitamente o tipo de um operando no outro. Se o SQL Server converter o tipo do literal no tipo da coluna, não haverá problema, mas se fizer o contrário, o desempenho será prejudicado porque o índice da coluna (se disponível) não será usado.

2. Conjunto de caracteres:

Se a coluna for do tipo nvarchar ou nchar, sempre use o prefixo N ao especificar a cadeia de caracteres na cláusula WHERE criterios / UPDATE / INSERT. Se você não fizer isso e um dos caracteres da sua string for unicode (como caracteres internacionais - exemplo - ā), ele falhará ou sofrerá corrupção de dados.

variável
fonte
4

Supondo que o valor seja do tipo nvarchar, somente para isso estamos usando N ''

RickyRam
fonte