Pourquoi sont des valeurs stockées dans une colonne NVARCHAR parfois rembourré avec des espaces?
Une application que je suis en train de travailler sur est de stocker des chaînes Unicode dans un NVARCHAR(50)
d'une colonne dans une base de données SQL Server 2005.
Parfois, la base de données renvoie une chaîne collier avec des espaces jusqu'à la longueur maximale de la colonne (50). À d'autres moments, le remplissage ne se produise pas.
Je pense que le type de cette colonne a été spécifié à l'origine comme NCHAR
, mais que, lorsque nous avons réalisé les espaces ont été ajoutés, nous l'avons changé en NVARCHAR(50)
. Cela pourrait-il avoir quelque chose à faire avec elle?
De toute façon, cette option sera désactivée?
Clarification
Je viens de réaliser que ce que j'ai écrit ci-dessus n'est pas clair que, même nouvellement insérés les chaînes se sont complétées par des espaces.
OriginalL'auteur dandan78 | 2011-04-21
Vous devez vous connecter pour publier un commentaire.
NCHAR dpa le terrain, NVARCHAR ne l'est pas. Mais si les données sont de l'ancien terrain, puis les espaces restera jusqu'à ce coupé.
Utiliser une instruction de mise à jour comme d'autres ont suggéré: Update Matable Set Macolonne = LTRIM(RTRIM(Macolonne));
Ce que je voulais dire, c'est que même si nous avons changé la colonne type de données NVARCHAR il y a des siècles, nouvellement insérés les chaînes sont encore en train de collier.
Une solution pourrait être de créer une nouvelle table avec nvarchar et de faire une instruction SELECT INTO pour copier les données de l'ancien tableau dans le nouveau compte à l'aide de fonctions de découpage sur le collier de colonnes que vous le faites. J'espère que ce devrait perdre le rembourrage. Peut-être la façon dont vous êtes l'insertion de valeurs est d'ajouter le rembourrage quelque chose de trop.
sont votre
INSERT
s cours d'exécution, pour ainsi dire, par une procédure stockée qui accepte les valeurs queNCHAR(50)
plutôt queNVARCHAR(50)
? Si la valeur est rembourré à un certain point, il parier qu'il va rester collier quand implicitement converti àNVARCHAR(50)
.OriginalL'auteur Chris Snowden
Si vous avez converti au préalable de
NCHAR
àNVARCHAR
, toutes les données précédemment saisies contient toujours les espaces. Vous pouvez mettre à jour tous par:Aïe, ça a été rapide sur le downvote. J'ai corrigé l'information fausse au départ, j'avais mis.
Je n'ai pas downvote vous de toute façon.
Non, j'ai deviné que ce n'était pas vous, mais celui qui n'a downvote a été rapide et pas de commentaire sur les raisons de soit... jamais l'esprit.
J'-vous ont voté supprimer l'-1.
OriginalL'auteur Jaymz
La "héritage" des espaces causées par la nchar type déjà persistent à cause de SET ANSI_PADDING SUR qui est la valeur par défaut.
Vous devez mettre à JOUR avec un RTRIM pour supprimer les espaces à droite.
OriginalL'auteur gbn
Vous pouvez parfois faire:
OriginalL'auteur Trey Carroll
NCHAR
colonnes sont complétées par des espaces, carCHARACTER
est d'une largeur fixe de type de données requis parSQL
standard:et
Noter que
ANSI_PADDING = ON
(qui est par défaut) les fonctions et les expressions autres que la concaténation et la comparaison implicitement tronquer les espaces surVARCHAR
arguments:OriginalL'auteur Quassnoi
Comment êtes-vous d'obtenir les valeurs dans la table? Je pense que c'est possible que si vous avez une procédure stockée et vous définissez explicitement la longueur du paramètre de mise à jour de cette colonne à 50 (dire via SqlCommand), il sera à la fin de rembourrage sur le ADO.NET côté déjà.
Venu ici via Google recherche pour
nvarchar padded spaces
, et c'était mon problème. Script de base de données est de type NVARCHAR(50), mais le modèle a définir le champ de Longueur Fixe = True. Belle prise!OriginalL'auteur Terence Lewis
Je suis tombé sur ce fil, tout en essayant de résoudre ce même problème et nous publierons de ma solution.
J'avais utilisé NChar comme c'est ma première base de données SQL et je ne connaissais pas le collier espaces. Ensuite, j'ai créé une LINQ-to-SQL classe afin de fournir l'accès à ma base de données. Quand plus tard, j'ai mis à jour ma base de données je n'ai pas de mise à jour de mon LINQ-to-SQL classe de sorte qu'il avait encore NChar dans le code derrière. J'ai changé pour résoudre le problème.
Si vous n'utilisez pas cette méthode exacte, vous pouvez avoir une solution similaire pour votre méthode. Quelque chose que vous utilisez pour ajouter des enregistrements n'a pas été mis à jour.
OriginalL'auteur Brian Loftus