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?
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
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
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.
... 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
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.
binary( 8 ) könnte ev. auch passen.
Stimmt, das könnte klappen.
Vielen Dank für deine Tipps!
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...
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)
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 :).