Quelle est la signification du préfixe N dans les instructions T-SQL et quand dois-je l'utiliser?


352

J'ai vu le préfixe N dans certaines requêtes T-SQL d'insertion. Beaucoup de gens l'ont utilisé Navant d'insérer la valeur dans un tableau.

J'ai cherché, mais je n'ai pas pu comprendre quel est le but d'inclure le Navant d'insérer des chaînes dans le tableau.

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

À quoi sert ce préfixe «N» et quand doit-il être utilisé?

Réponses:


415

Il déclare la chaîne comme nvarchartype de données, plutôt quevarchar

Vous avez peut-être vu du code Transact-SQL qui transmet des chaînes à l'aide d'un préfixe N. Cela indique que la chaîne suivante est en Unicode (le N signifie en fait le jeu de caractères de langue nationale). Ce qui signifie que vous transmettez une valeur NCHAR, NVARCHAR ou NTEXT, par opposition à CHAR, VARCHAR ou TEXT.

Pour citer Microsoft :

Préfixez les constantes de chaîne de caractères Unicode avec la lettre N. Sans le préfixe N, la chaîne est convertie dans la page de codes par défaut de la base de données. Cette page de codes par défaut peut ne pas reconnaître certains caractères .


Si vous souhaitez connaître la différence entre ces deux types de données, consultez cet article SO:

Quelle est la difference entre varchar et nvarchar?


1
@Curt, cela signifie que je ne dois utiliser Nque lorsque j'utilise les types de données suivants CHAR, VARCHAR or TEXT?? parce que `NCHAR, NVARCHAR ou NTEXT` sont intrinsèquement unicode UNICODE je n'ai pas besoin de l'ajouter séparément .... est-ce vrai?
Pritesh

@Pritesh - Uniquement si vous utilisez une page de codes par défaut qui peut ne pas reconnaître ces caractères unicode comme en gras ci-dessus.
Todd

5
@Curt Le lien vers databases aspfaq comredirige vers des sites Web extrêmement douteux ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), qui ont été marquées par notre pare - feu d' entreprise comme la pornographie, les sites malveillants et les URL de spam. J'ai contacté le propriétaire d'aspfaq.com et modifié la réponse pour supprimer le lien.
jaume

21

Permettez-moi de vous dire une chose ennuyeuse qui s'est produite avec le N'préfixe - je n'ai pas pu le réparer pendant deux jours.

Mon classement de base de données est SQL_Latin1_General_CP1_CI_AS .

Il a une table avec une colonne appelée MyCol1 . C'est un Nvarchar

Cette requête ne correspond pas à la valeur exacte qui existe.

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

// 0 result

l'utilisation du préfixe N '' le corrige

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

// 1 result - found!!!!

Pourquoi? Parce que latin1_general n'a pas de gros points İ c'est pourquoi il échoue, je suppose.


8

1. Performance:

Supposons que votre clause where est comme ceci:

WHERE NAME='JON'

Si la colonne NAME est de tout type autre que nvarchar ou nchar, vous ne devez pas spécifier le préfixe N. Cependant, si la colonne NAME est de type nvarchar ou nchar, alors si vous ne spécifiez pas le préfixe N, «JON» est traité comme non unicode. Cela signifie que le type de données de la colonne NAME et de la chaîne «JON» sont différents et que SQL Server convertit implicitement le type d'un opérande en l'autre. Si SQL Server convertit le type du littéral en type de colonne, il n'y a pas de problème, mais s'il fait l'inverse, les performances seront affectées car l'index de la colonne (si disponible) ne sera pas utilisé.

2. Jeu de caractères:

Si la colonne est de type nvarchar ou nchar, utilisez toujours le préfixe N tout en spécifiant la chaîne de caractères dans la clause WHERE criteria / UPDATE / INSERT. Si vous ne le faites pas et que l'un des caractères de votre chaîne est unicode (comme les caractères internationaux - exemple - à), il échouera ou subira une corruption des données.


4

En supposant que la valeur est de type nvarchar, nous utilisons uniquement N ''

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.