web-dev-qa-db-fra.com

Comment conserver les zéros non significatifs lorsque j'insère un nombre dans ce tableau?

J'ai inséré deux enregistrements dans une table.

create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num

Lorsque je les interroge, ils s'affichent tous sous la forme 23. Cela signifie que SQL Server ignore les premiers 0. Quel est le mécanisme derrière cela? Comment puis-je demander à SQL Server de renvoyer les valeurs telles que je les ai insérées (c'est-à-dire 0023 et 23)?

10
user8365

0023 n'est pas un nombre. C'est une chaîne. 23 est le nombre. SQL Server est capable de reconnaître que ces zéros supplémentaires ne sont pas nécessaires pour définir le nombre, il les ignore donc. Si vous souhaitez afficher une valeur de 0023 dans l'application, je vous suggère de faire le formatage côté application. De cette façon, le nombre stocké dans SQL Server est toujours un nombre si vous souhaitez effectuer un ajout, une agrégation ou d'autres calculs. Si vous devez vraiment le stocker en tant que '0023 ', vous devez le convertir en champ de caractères; char, varchar, nvarchar, nchar.

27
Grant Fritchey

Il a déjà été dit dans d'autres réponses que 00023 est un nombre; Je veux juste ajouter que vous pouvez utiliser des colonnes calculées pour afficher ce nombre en utilisant un format personnalisé. Par exemple,

create table num_table(id int not null primary key identity(1,1),
num int, leading_zeros smallint,
constraint chk_leading_zero_nonnegative check (leading_zero>=0),
num_formatted as replicate('0',coalesce(leading_zeros,0)) +cast(num as varchar(10)));
insert into num_table(num,leading_zeros) values(23,2) ;
select num_formatted from num_table; -- output '0023'
5
a1ex07

0023 est un nombre mais les types de données int et autres nombres ne stockent pas de zéros de tête car il n'y a aucune raison mathématique de le faire.

Si vous devez stocker des zéros non significatifs, utilisez un type de données de type chaîne, char, varchar, etc.

0
Jimbo