Come conservo gli zeri iniziali quando inserisco un numero in questa tabella? [chiuso]


10

Ho inserito due record in una tabella.

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

Quando li interrogo, vengono visualizzati tutti come 23. Significa che SQL Server ignora gli 0 iniziali. Qual è il meccanismo dietro questo? Come posso avere SQL Server restituire i valori quando li ho inseriti (cioè 0023e 23)?


2
Perché ti preoccupi degli zeri principali? Se sono significativi per il tuo sistema, iddovrebbero essere di tipo VARCHARo simili.
Nick Chammas,

Esattamente come prevedete che 0023 sia codificato nel database come qualcosa di diverso da 23 o 023 o 0000000023? Rappresentano tutti lo stesso NUMERO. E int è un tipo di dati NUMBER. Non c'è spazio per il server per memorizzare questo valore "numero iniziale di zero decimali".
ErikE

Questa è una domanda scadente e sarebbe stata trattata in qualsiasi introduzione alla lezione di programmazione. Un int non può mai memorizzare gli zeri iniziali, a causa della natura degli ints. Ciò può essere risolto esaminando un numero qualsiasi di risorse Web. Ciò non richiede l'input di un amministratore del database.
jcolebrand

1
Gli zeri iniziali sono impliciti. Oltre a utilizzare una stringa, invece, se è necessario un numero specifico di zeri iniziali, si tratta di informazioni aggiuntive oltre a quelle archiviate in una colonna int. Un'opzione utilizza una colonna stringa, ma un'altra opzione è la memorizzazione del numero di zeri iniziali in un'altra colonna o nell'interfaccia utente. se l'interfaccia utente viene sempre formattata a 4 cifre con zero iniziale di riempimento, ad esempio, queste informazioni sono state memorizzate nell'interfaccia utente. Se è necessario che il numero di zero vari e sia conservato per ciascun record, è possibile invece memorizzare tali informazioni in un campo separato.
Dave Cousineau,

Risposte:


27

0023non è un numero. È una stringa. 23è il numero. SQL Server è in grado di riconoscere che quegli zeri extra non sono necessari per definire il numero, quindi li ignora. Se si desidera distribuire un valore come 0023 all'applicazione, suggerirei di eseguire la formattazione sul lato dell'applicazione. In questo modo il numero memorizzato in SQL Server è ancora un numero se si desidera eseguire addizioni, aggregazioni o altri calcoli. Se devi davvero memorizzarlo come ' 0023', devi convertirlo in un campo carattere; char, varchar, nvarchar, nchar.


Se 0023 è una stringa, come posso inserire il valore nella tabella in cui ho definito l'id come formato int?
user8365

@ user8365 - Definire idcome VARCHARo semplicemente inserire 23 invece di 0023
Lamak

5
@ user8365 - Stai chiedendo se è possibile fare in modo che SQL Server violi l' integrità del dominio di quel campo. Non puoi. Se 0023è una stringa, memorizzala come stringa. In caso contrario, memorizzalo come INT e dimentica gli zeri iniziali.
Nick Chammas,

Esattamente quello che ha detto @NickChammas. Non hai scelta qui. 23 è un numero, 0023 è una stringa. Se vuoi un numero, trattalo come un numero. Come dice la mia risposta, se deve ordinare come un numero, aggiungere, sottrarre, moltiplicare, dividere, ecc., Come un numero, deve essere un numero. Nessuna scelta Nessun argomento. Gli zeri iniziali sono solo formattazione. Fallo nel codice dell'app o da qualche parte.
Concedi Fritchey il

@Grant Non posso essere d'accordo sul fatto che gli zeri iniziali stiano solo formattando. Sono legittimi in qualsiasi sistema numerico; tuttavia, 0023b10 = 23b10; quindi, qualsiasi sistema di archiviazione ottiene un certo grado di compressione non codificando tutti gli zero iniziali. Quindi, fondamentalmente, il nostro interrogante sta ponendo la domanda sbagliata. Perché 0023 non è un numero intero? È un numero intero! Non abbiamo solo bisogno di codificare un'infinità di numeri iniziali per rappresentarlo come tale.
uscita il

5

È stato già detto in altre risposte che 00023è un numero; Voglio solo aggiungere che puoi usare le colonne calcolate per mostrare quel numero usando il formato personalizzato. Per esempio,

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'

Un buon punto, assolutamente degno di nota.
Concedi Fritchey il

0

0023 è un numero ma i tipi di dati int e altri numeri non memorizzano zeri iniziali poiché non esiste alcun motivo matematico per farlo.

Se è necessario memorizzare zero iniziali, utilizzare un tipo di dati stringa come char, varchar ecc


1
Se assumiamo che INTsia di lunghezza fissa (come 32 bit) e che la notazione binaria venga utilizzata per memorizzarli, gli zero iniziali vengono effettivamente memorizzati. Ma non vengono visualizzati nell'output.
ypercubeᵀᴹ

@ypercube - Esatto, ma il numero di zeri iniziali è semplicemente ciò che è richiesto per riempire i 32 bit (invece che definibile dall'utente).
Nick Chammas,

@ Nick: Sì, non discutere qui. Penso che il punto NON sia se siano memorizzati o meno gli zero iniziali. Indica se due versioni dello stesso numero possono essere memorizzate nel tipo di dati, una con e una senza zeri iniziali.
ypercubeᵀᴹ

Ma questo non ha senso. Due zero iniziali decimali non hanno assolutamente alcuna relazione con il numero di zero iniziali in un numero intero a 32 bit. Si consideri il numero decimale 15--Questo richiede solo una cifra in esadecimale, F. Hanno già un numero diverso di "zeri iniziali". 2147483647 è composto da 10 cifre, ma in esadecimale sono solo 7FFFFFFF o 8 cifre.
ErikE

Fondamentalmente, si deve considerare il sistema numerico matematico che stiamo usando ... in questo caso decimale (base 10). 23 è un numero decimale; è 0x1000 + 0x100 + 2x10 + 3 = 23. In ottale è 2X8 + 3 e così via. Quindi, per dire al motore di archiviazione, "store 23 con due zeri iniziali" non è utile, poiché codifica semplicemente lo stesso risultato finale, ovvero 23. SQL Server non ignora i tuoi zero, ti restituisce semplicemente un valore decimale uguale al numero che hai inserito, ad esempio 0023 o 23.
uscita il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.