Wie behalte ich die führenden Nullen bei, wenn ich eine Zahl in diese Tabelle einfüge? [geschlossen]

10

Ich habe zwei Datensätze in eine Tabelle eingefügt.

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

Wenn ich sie abfrage, werden sie alle als angezeigt 23. Dies bedeutet, dass SQL Server die führenden Nullen ignoriert. Was ist der Mechanismus dahinter? Wie kann SQL Server die Werte beim Einfügen zurückgeben (dh 0023und 23)?

user8365
quelle
2
Warum interessieren Sie sich für die führenden Nullen? Wenn sie für Ihr System von Bedeutung sind, idsollten sie vom Typ VARCHARoder ähnlich sein.
Nick Chammas
Wie genau erwarten Sie, dass 0023 in der Datenbank als etwas anderes als 23 oder 023 oder 0000000023 codiert wird? Sie alle repräsentieren die gleiche NUMMER. Und int ist ein NUMBER-Datentyp. Der Server kann diesen Wert "führende Anzahl von Dezimalstellen" nicht speichern.
ErikE
Dies ist eine schlechte Frage, die in jeder Einführung in den Programmierunterricht behandelt worden wäre. Ein Int kann aufgrund der Natur von Ints niemals führende Nullen speichern. Dies kann durch Betrachten einer beliebigen Anzahl von Webressourcen gelöst werden. Dies erfordert nicht die Eingabe eines Datenbankadministrators.
Jcolebrand
1
Führende Nullen sind impliziert. Wenn Sie stattdessen eine Zeichenfolge verwenden und eine bestimmte Anzahl führender Nullen benötigen, sind dies zusätzliche Informationen, die über das hinausgehen, was in einer int-Spalte gespeichert ist. Eine Option verwendet eine Zeichenfolgenspalte, eine andere Option speichert die Anzahl der führenden Nullen entweder in einer anderen Spalte oder in der Benutzeroberfläche. Wenn die Benutzeroberfläche beispielsweise immer 4-stellig formatiert ist und beispielsweise führende Nullen aufgefüllt werden, haben Sie diese Informationen in der Benutzeroberfläche gespeichert. Wenn die Anzahl der Nullen variieren und für jeden Datensatz beibehalten werden muss, können Sie diese Informationen stattdessen in einem separaten Feld speichern.
Dave Cousineau

Antworten:

27

0023ist keine Zahl. Es ist eine Schnur. 23ist die Nummer. SQL Server kann erkennen, dass diese zusätzlichen Nullen nicht benötigt werden, um die Nummer zu definieren, und ignoriert sie daher. Wenn Sie der Anwendung einen Wert als 0023 anzeigen möchten, würde ich empfehlen, die Formatierung auf der Anwendungsseite vorzunehmen. Auf diese Weise ist die in SQL Server gespeicherte Nummer immer noch eine Nummer, wenn Sie Additionen, Aggregationen oder andere Berechnungen durchführen möchten. Wenn Sie es wirklich als ' 0023' speichern müssen, müssen Sie es in ein Zeichenfeld konvertieren. char, varchar, nvarchar, nchar.

Grant Fritchey
quelle
Wie kann ich den Wert in die Tabelle einfügen, in der ich die ID als int-Format definiert habe, wenn 0023 eine Zeichenfolge ist?
user8365
@ user8365 - Entweder definieren idals VARCHARoder nur 23 anstelle von 0023 einfügen
Lamak
5
@ user8365 - Sie fragen, ob SQL Server die Domänenintegrität dieses Felds verletzen kann . Das kannst du nicht. Wenn 0023es sich um eine Zeichenfolge handelt, speichern Sie sie als Zeichenfolge. Wenn dies nicht der Fall ist, speichern Sie es als INT und vergessen Sie die führenden Nullen.
Nick Chammas
Genau das, was @NickChammas gesagt hat. Sie haben hier keine Wahl. 23 ist eine Zahl, 0023 ist eine Zeichenfolge. Wenn Sie eine Nummer möchten, behandeln Sie sie als Nummer. Wie meine Antwort sagt, wenn es wie eine Zahl sortieren, addieren, subtrahieren, multiplizieren, dividieren usw. muss, dann muss es eine Zahl sein. Keine Auswahl. Keine Argumente. Führende Nullen sind nur Formatierungen. Mach das im App-Code oder irgendwo.
Grant Fritchey
@Grant Ich kann nicht zustimmen, dass die führenden Nullen nur formatiert werden. Sie sind in jedem Zahlensystem legitim; 0023b10 = 23b10; Daher erhält jedes Speichersystem einen gewissen Grad an Komprimierung, indem nicht alle führenden Nullen codiert werden. Grundsätzlich stellt unser Fragesteller also die falsche Frage. Warum ist 0023 keine ganze Zahl? Es ist eine ganze Zahl! Wir müssen einfach nicht unendlich viele führende Ziffern codieren, um sie als solche darzustellen.
ooutwire
5

Es wurde bereits in anderen Antworten gesagt, dass 00023es sich um eine Zahl handelt; Ich möchte nur hinzufügen, dass Sie berechnete Spalten verwenden können, um diese Zahl im benutzerdefinierten Format anzuzeigen. Beispielsweise,

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
quelle
Guter Punkt, absolut erwähnenswert.
Grant Fritchey
0

0023 ist eine Zahl, aber die Datentypen int und andere Zahlen speichern keine führenden Nullen, da es keinen mathematischen Grund dafür gibt.

Wenn Sie führende Nullen speichern müssen, verwenden Sie einen Zeichenfolgendatentyp wie char, varchar usw.

Jimbo
quelle
1
Wenn wir davon ausgehen, dass INTes sich um eine feste Länge (wie 32 Bit) handelt und zum Speichern eine binäre Notation verwendet wird, werden tatsächlich führende Nullen gespeichert. Sie werden jedoch nicht in der Ausgabe angezeigt.
Ypercubeᵀᴹ
@ypercube - Richtig, aber die Anzahl der führenden Nullen ist einfach erforderlich, um die 32 Bits zu füllen (im Gegensatz zu benutzerdefinierbaren).
Nick Chammas
@ Nick: Ja, da gibt es keinen Streit. Ich denke, der Punkt ist NICHT, ob führende Nullen gespeichert sind oder nicht. Es geht darum, ob zwei Versionen derselben Nummer im Datentyp gespeichert werden können, eine mit und eine ohne führende Nullen.
Ypercubeᵀᴹ
Das macht aber keinen Sinn. Zwei dezimale führende Nullen haben absolut keine Beziehung zur Anzahl der führenden Nullen in einer 32-Bit-Ganzzahl. Betrachten Sie die Dezimalzahl - 15dies nimmt nur eine hexadezimale Ziffer F. Sie haben bereits eine andere Anzahl von "führenden Nullen". 2147483647 besteht aus 10 Ziffern, aber in hexadezimaler Schreibweise sind das nur 7FFFFFFF oder 8 Ziffern.
ErikE
Grundsätzlich muss man das mathematische Zahlensystem betrachten, das wir verwenden ... in diesem Fall dezimal (Basis 10). 23 ist eine Dezimalzahl; es ist 0x1000 + 0x100 + 2x10 + 3 = 23. Im Oktal ist es 2X8 + 3 und so weiter. Um der Speicher-Engine zu sagen, dass "Speicher 23 mit zwei führenden Nullen" nicht sinnvoll ist, da es lediglich das gleiche Endergebnis codiert, nämlich 23. SQL Server ignoriert Ihre Nullen nicht, sondern gibt lediglich einen Dezimalwert an Sie zurück gleich der Zahl, die Sie eingefügt haben, dh 0023 oder 23.
ooutwire