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

10

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 0 en tête. Quel est le mécanisme derrière cela? Comment puis-je demander à SQL Server de renvoyer les valeurs lorsque je les ai insérées (c'est 0023-à- dire et 23)?

user8365
la source
2
Pourquoi vous souciez-vous des zéros principaux? S'ils sont significatifs pour votre système, ils iddoivent être de type VARCHARou similaire.
Nick Chammas
Comment voulez-vous exactement que 0023 soit codé dans la base de données comme quelque chose de différent de 23 ou 023 ou 0000000023? Ils représentent tous le même NUMÉRO. Et int est un type de données NUMBER. Il n'y a pas de place pour que le serveur stocke cette valeur "nombre de zéros décimaux".
ErikE
C'est une mauvaise question, et aurait été abordée dans toute introduction à la classe de programmation. Un int ne peut jamais stocker de zéros non significatifs, en raison de la nature des entiers. Cela peut être résolu en consultant un certain nombre de ressources Web. Cela ne nécessite pas l'entrée d'un administrateur de base de données.
jcolebrand
1
Les zéros non significatifs sont implicites. Outre l'utilisation d'une chaîne à la place, si vous avez besoin d'un nombre spécifique de zéros non significatifs, il s'agit d'informations supplémentaires au-delà de ce qui est stocké dans une colonne int. Une option utilise une colonne de chaînes, mais une autre option stocke le nombre de zéros non significatifs dans une autre colonne ou dans l'interface utilisateur. si l'interface utilisateur formate toujours à 4 chiffres avec des zéros non significatifs, par exemple, vous avez stocké ces informations dans l'interface utilisateur. Si vous avez besoin que le nombre de zéros varie et soit conservé pour chaque enregistrement, vous pouvez plutôt stocker ces informations dans un champ séparé.
Dave Cousineau

Réponses:

27

0023n'est pas un nombre. C'est une chaîne. 23est 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 sous ' 0023', vous devez le convertir en champ de caractères; char, varchar, nvarchar, nchar.

Grant Fritchey
la source
Si le 0023 est une chaîne, comment puis-je insérer la valeur dans la table dont j'ai défini l'id au format int?
user8365
@ user8365 - Définissez idcomme VARCHARou insérez simplement 23 au lieu de 0023
Lamak
5
@ user8365 - Vous demandez si vous pouvez faire en sorte que SQL Server viole l' intégrité du domaine de ce champ. Tu ne peux pas. Si 0023est une chaîne, stockez-la sous forme de chaîne. Si ce n'est pas le cas, stockez-le comme INT et oubliez les zéros de tête.
Nick Chammas
Exactement ce que @NickChammas a dit. Vous n'avez pas le choix ici. 23 est un nombre, 0023 est une chaîne. Si vous voulez un numéro, traitez-le comme un numéro. Comme ma réponse le dit, s'il doit trier comme un nombre, additionner, soustraire, multiplier, diviser, etc., comme un nombre, alors il doit être un nombre. Pas de choix. Aucun argument. Les zéros non significatifs ne sont que du formatage. Faites cela dans le code de l'application ou quelque part.
Grant Fritchey
@Grant Je ne peux pas accepter que les zéros non significatifs ne soient que du formatage. Ils sont légitimes dans tout système numérique; cependant, 0023b10 = 23b10; ainsi, tout système de stockage gagne un certain degré de compression en n'encodant pas tous les zéros de tête. Donc, fondamentalement, notre intervenant pose la mauvaise question. Pourquoi 0023 n'est-il pas un entier? C'est un entier! Nous n'avons tout simplement pas besoin d'encoder une infinité de premiers chiffres pour le représenter comme tel.
ooutwire
5

Cela a déjà été dit dans d'autres réponses, c'est 00023un chiffre; 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'
a1ex07
la source
Bon point, à noter absolument.
Grant Fritchey
0

0023 est un nombre mais les types de données int et autres nombres ne stockent pas de zéros en 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.

Jimbo
la source
1
Si nous supposons qu'il INTest de longueur fixe (comme 32 bits) et que la notation binaire est utilisée pour les stocker, les zéros de tête sont en effet stockés. Mais ils ne sont pas affichés dans la sortie.
ypercubeᵀᴹ
@ypercube - C'est vrai, mais le nombre de zéros non significatifs est simplement ce qui est nécessaire pour remplir les 32 bits (par opposition à définissable par l'utilisateur).
Nick Chammas
@ Nick: Ouais, pas d'argument. Je pense que le point n'est PAS de savoir si les zéros non significatifs sont stockés ou non. Il s'agit de savoir si deux versions du même numéro peuvent être stockées dans le type de données, une avec et une sans zéros non significatifs.
ypercubeᵀᴹ
Mais cela n'a aucun sens. Deux zéros non significatifs décimaux n'ont absolument aucune relation avec le nombre de zéros non significatifs dans un entier 32 bits. Considérons le nombre décimal 15--Ce ne prend un chiffre en hexadécimal, F. Ils ont déjà un nombre différent de «zéros de tête». 2147483647 est à 10 chiffres, mais en hexadécimal, c'est seulement 7FFFFFFF ou 8 chiffres.
ErikE
Fondamentalement, il faut considérer le système numérique mathématique que nous utilisons ... dans ce cas décimal (base 10). 23 est un nombre décimal; c'est 0x1000 + 0x100 + 2x10 + 3 = 23. En octal, c'est 2X8 + 3 et ainsi de suite. Donc, pour dire au moteur de stockage, "stocker 23 avec deux zéros non significatifs" n'est pas utile, car il code simplement le même résultat final, c'est-à-dire 23. SQL Server n'ignore pas vos zéros, il vous renvoie simplement une valeur décimale égal au nombre que vous avez inséré, soit 0023 ou 23.
ooutwire