TSQL Préfixant Littéral de Chaîne sur l'Insert de la Valeur à Ce, ou Redondantes?
J'ai juste hérité d'un projet de code semblable au suivant (plutôt simple) exemple:
DECLARE @Demo TABLE
(
Quantity INT,
Symbol NVARCHAR(10)
)
INSERT INTO @Demo (Quantity, Symbol)
SELECT 127, N'IBM'
Mon intérêt est à la N
avant la chaîne de caractères littérale.
Je comprends que le préfixe N
est de spécifier le codage (dans ce cas, Unicode). Mais depuis la sélection est seulement pour l'insérer dans un champ qui est clairement déjà Unicode, ne serait-ce pas la valeur sera automatiquement sortie?
J'ai exécuter le code sans le N
et il semble fonctionner, mais j'ai loupé quelque chose que la précédente programmeur est-il destiné? Ou était le N
un oubli de sa part?
J'attends un comportement similaire à lorsque je passe un int
à un decimal
champ (auto-sortie). Puis-je me débarrasser de ces N
s?
Vous devez vous connecter pour publier un commentaire.
Votre test n'est pas vraiment valide, essayez quelque chose comme un caractère Chinois au lieu de cela, je me souviens si vous n'avez pas de préfixe il ne sera pas insérer le caractère correct
exemple, d'abord on montre un point d'interrogation, tandis que celui du bas montre un carré
Un meilleur exemple, même ici, la sortie n'est pas la même
Depuis ce à quoi vous ressemblez est un tableau des stocks pourquoi êtes-vous en utilisant unicode, il y a même des symboles unicode..j'ai jamais vu, et cela inclut ISIN, CUSIP et SEDOLS
Oui, SQL Server va les convertir automatiquement (élargir, précipité) varchar nvarchar, de sorte que vous pouvez supprimer le N dans ce cas. Bien sûr, si vous êtes en spécifiant une chaîne littérale où les personnages ne sont pas réellement présentes dans la base de données par défaut du classement, alors que vous en avez besoin.
C'est comme vous pouvez le suffixe d'un nombre avec un "L" sur le C et al pour indiquer que c'est un long littérale au lieu d'un int. L'écriture n''IBM' est, soit une précision ou un esclave de l'habitude, selon votre point de vue.
Un piège pour les imprudents: nvarchar n'obtient pas automatiquement converties en varchar, et cela peut être un problème si votre demande est tous Unicode et votre base de données n'est pas. Par exemple, nous avons eu cette avec la jTDS pilote JDBC, qui lie toutes les valeurs de paramètre de type nvarchar, résultant dans les déclarations efficacement comme ceci:
(où purchase_reference était une colonne de type varchar)
Depuis les conversions automatiques ne sont qu'un moyen, c'est devenu:
et par conséquent, l'indice de purchase_reference n'a pas été utilisé.
En revanche, l'inverse est très bien: si purchase_reference était un type nvarchar, et une application passés dans un varchar paramètre, alors la requête réécrite:
ce serait bien. En fin de compte, nous avons dû désactiver les paramètres de liaison en Unicode, donc causer une multitude de problèmes d'i18n qui ont été considérés comme moins graves.