Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Uint64: wie in MSSQL abbilden?

Yves3 / 10 Antworten / Baumansicht Nickles

Hallo

Was für einen Datentypen muss ich wählen um einen Wert vom Typ uint64 in einer MSSQL Datenbank zu speichern?
Bigint ist 8 Byte (also 64 bit) gross, damit können aber auch negative Zahlen abgebildet werden, es wird also kaum reichen.

Ich tippe auf numeric(20, 0). Wenn ich das richtig verstanden habe beinhaltet dieser Typ 20 Stellen, von denen 0 nach dem Komma sind.
Die höchstmögliche Zahl, die sich mit uint64 darstellen lässt sollte eigentlich 18446744073709551616 sein, hätte also in den 20 Stellen vor dem Komma platz. Allerdings ist dieser Typ grösser als nötig, da er auch negative Zahlen abbilden kann.

Was meint ihr, welcher Typ ist der beste?

bei Antwort benachrichtigen
d-oli Yves3 „Uint64: wie in MSSQL abbilden?“
Optionen
BIGINT 8 Bytes [(M)] [U] [Z] Ganzzahlen von 0 bis 2^64-1 oder von -(2^63) bis (2^63)-1.
Legende
M = maximale Anzahl der gezeigten Stellen
U = UNSIGNED (Zahl ohne Vorzeichen)
Z = Zerofill


Quelle: http://www.schmager.de/mysql.php

... also sollte doch auch BIGINT gehen, wenn du die Option U verwendest. Am besten du probierst es aus. Rechne in deinem Progi 2^64-1, schreibe das Resultat in die Datenbank und dann wird sich zeigen, was beim Lesen daher kommt.

CREATE TABLE `blabla` (
   `bla` bigint(20) unsigned,
   ...
);

Gruss
d-oli

PS: Die höchstmögliche Zahl für BIGINT und uint64 (Matlab oder .NET ..?) ist 2^64-1 = 18'446'744'073'709'551'61 5
Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
Yves3 d-oli „ Quelle: http://www.schmager.de/mysql.php ... also sollte doch auch BIGINT...“
Optionen

Bei MySQL habe ich das auch schon gefunden, es geht aber um MSSQL.
Ob es klappt kann ich schon prüfen, ich habe mich nur gefragt ob man da noch einen besser geeigneten Typ findet.

PS: Die höchstmögliche Zahl für BIGINT und uint64 (Matlab oder .NET ..?) ist 2^64-1 = 18'446'744'073'709'551'615
Stimmt, 0 kann ja auch dargestellt werden... hab ich irgendwie übersehen.

bei Antwort benachrichtigen
d-oli Yves3 „Bei MySQL habe ich das auch schon gefunden, es geht aber um MSSQL. Ob es klappt...“
Optionen
Bei MySQL habe ich das auch schon gefunden, es geht aber um MSSQL.
... ups - sorry ... My vs. MS ... war wohl ein Freudscher Verleser ... ;-)

... ich habe mich nur gefragt ob man da noch einen besser geeigneten Typ findet
Das kommt auf die Anwendung und Anforderungen an. Ich denke, dass sich BIGINT (unsigned) sehr gut für eine Identitätsspalte eignet, weil ein arithmetischer Überlauffehler nicht so schnell auftreten wird.
Quelle: http://www.berndjungbluth.de/sqlfaq/faqa3.htm > A3.16. Identitätsspalte zu klein

Für Berechnungen würde ich eher NUMERIC verwenden, aber nur, wenn die Kommastellen begrenzt sein sollen.

Weitere Links:
http://technet.microsoft.com/de-de/library/ms172424.aspx
http://www.sql-und-xml.de/server-daten/sql-befehle/datentypen.html
http://www.berndjungbluth.de/sqlfaq/faqb4.htm

Gruss
d-oli



Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
Yves3 d-oli „ ... ups - sorry ... My vs. MS ... war wohl ein Freudscher Verleser ... - Das...“
Optionen

Es geht um Daten, die müssen aber ohne Weiterverarbeitung in der DB gespeichert werden und sind in jedem Fall positive Ganzzahlen.

So wie es aussieht kann man bei MSSQL bei den Typen leider nicht angeben ob sie signed oder unsigned sind (oder geht das irgendwie?).
Wenn das so ist, dann wäre BIGINT leider zu klein und NUMERIC(20, 0) zu gross. In diesem Fall bliebe mir wohl nur NUMERIC.

bei Antwort benachrichtigen
d-oli Yves3 „Es geht um Daten, die müssen aber ohne Weiterverarbeitung in der DB gespeichert...“
Optionen


binary( 8 ) könnte ev. auch passen.
Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
Yves3 d-oli „binary 8 könnte ev. auch passen. “
Optionen

Stimmt, das könnte klappen.
Vielen Dank für deine Tipps!

bei Antwort benachrichtigen
Yves3 Nachtrag zu: „Uint64: wie in MSSQL abbilden?“
Optionen

Ich habe noch einige Fragen zum Datentyp Varchar und stelle die mal in diesem Thread.
Der MSDN Artikel dazu konnte mir leider nicht weiterhelfen.

1. Ist die Zahl, die man in Klammern angibt, die Grösse in Byte oder in Zeichen, oder ist das sogar das gleiche? Ich nehme an es sind Zeichen gemeint, wenn von "length" gesprochen wird...

2. Der benötigte Speicherplatz wird mit Datengrösse + 2 Byte berechnet. Wenn diese maximale Grösse beispielsweise 128 Zeichen beträgt, tatsächlich aber nur 28 verwendet werden, dann benötigt es auch nur den Speicherplatz von 28 Zeichen + 2 Byte. Ist das soweit richtig? Falls ja, wieso gibt man dann nicht immer die maximalen 8000 an? Sollte man also nur dann weniger Zeichen angeben, wenn man genau weiss, dass es definitiv (und nicht nur zu einer 99.9999 prozentigen Wahrscheinlichkeit) nicht mehr sein können?

EDIT: Hmm ich glaube mir ist gerade eine mögliche Antwort auf Frage 2 eingefallen. Das ist beispielsweise eine Möglichkeit um das Programm, das die Daten aus der DB bezieht, vor Puffer Überläufen zu schützen. Obwohl es vielleicht kluger währe, solche Probleme im Programmcode abzufangen...

bei Antwort benachrichtigen
d-oli Yves3 „Ich habe noch einige Fragen zum Datentyp Varchar und stelle die mal in diesem...“
Optionen

2. Der benötigte Speicherplatz wird mit ...
http://entwickler-forum.de/showthread.php?t=42960
Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
d-oli Yves3 „Ich habe noch einige Fragen zum Datentyp Varchar und stelle die mal in diesem...“
Optionen
1. Ist die Zahl, die man in Klammern angibt ...

ASCII [char(1-8000)/varchar(1-8000)]:
1 CHAR(ACTER) = 1 BYTE

UNICODE [nchar(1-4000)/nvarchar(1-4000)]:
1 CHAR(ACTER) = 2 BYTE


character [abbr.: char] das Zeichen (Quelle: www.leo.org)
Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
Yves3 d-oli „ ASCII char 1-8000 /varchar 1-8000 : 1 CHAR ACTER 1 BYTE UNICODE nchar 1-4000...“
Optionen

Vielen Dank!
Jetzt seht meine Datenstruktur bis auf den Datentyp des Uint64 Wertes, da wird aber entweder Binary(8) oder Numeric(20,0) passen. Ein paar kleine Tests und dann habe ich das auch :).

bei Antwort benachrichtigen