Avatar billede torotune Nybegynder
24. august 2006 - 12:57 Der er 21 kommentarer og
2 løsninger

Valuta-format

Hej,

Er lidt i tvivl om hvad jeg skal bruge som currency-format i MySQL.

DOUBLE(9,2)
eller
DECIMAL(9,2)

På MySQL's hjemmeside skriver de at
DECIMAL(19,4)

Udgør currency - men hvorfor 4 nuller efter kommaet?

Med venlig hilsen.
Avatar billede razmuz_dk Nybegynder
24. august 2006 - 14:36 #1
Hm, umiddelbart vil jeg tro, at grunden til at de skriver ,4 blot er for at kunne angive et givent beløb så præcists som muligt (fx DKK 123,1234).

I DK angiver beløb meget sjældent med over 2 decimaler, så 9,2 er vel fint som value til din datatype.

Mht til valg af datatype vil jeg anbefale FLOAT - den bruger mindst diskplads, men er desværre ikke helt så præcis som DOUBLE og DECIMAL. Hvis du blot skal plusse og minusse, så er FLOAT derfor helt klart det bedste valg.
Avatar billede torotune Nybegynder
24. august 2006 - 15:31 #2
Hej,

Okay, jeg prøvede nemlig at konvertere en Access-database til MySql via Migration Toolkit. I min Access havde jeg sat min kollonne til valuta til Dobbelt Reelt tal med 2 decimaler.

I den genererede MySQL blev kollonnen sat til datatypen DOUBLE(9,5) (?)
Men hvis Float er mere optimalt vil jeg da ændre det til det, jeg vil gerne kunne pludse og minusse. 

En anden ting:

Kollonner i den pågældende Access-database der var af typen "Autonummerering" er i MySql blevet sat til INT(10) - skal jeg her selv sætte dissse til "Autoincrement"?
Avatar billede razmuz_dk Nybegynder
24. august 2006 - 15:36 #3
DOUBLE vil virke helt fint - men den fylder bare mere end FLOAT. Som sagt hvis du KUN skal minusse og plusse er FLOAT optimalt. Hvis du skal lave mere avancerede matematisk operationer som fx at gange store beløb med andre store beløb, så er det måske en god idé at bruge DOUBLE.

Nu kender jeg ikke Migration Toolkit, men ja - du skal også selv sætte auto increment på de kolonner, der skal autonumereres i mysql.
Avatar billede torotune Nybegynder
24. august 2006 - 16:00 #4
Okay, det må jeg gøre så. Jeg skifter ud til float :-) Lige til sidst, er der en måde hvorpå man i MySQL administrator kan se en grafisk oversigt over ens tabeller og deres relationer?
Avatar billede razmuz_dk Nybegynder
24. august 2006 - 16:22 #5
Phpmyadmin! Det er en web-baseret service, der viser indholdet af din database. Det kræver PHP og kan hentes på phpmyadmin.net

Det kan dog være lidt tricky at installere første gang man gør.
Avatar billede torotune Nybegynder
24. august 2006 - 17:20 #6
Okay, det vil jeg lige se på :-)

Jeg takker mange gange for hjælpen. - Smid et svar!
Avatar billede razmuz_dk Nybegynder
24. august 2006 - 17:29 #7
Selv tak!
Avatar billede arne_v Ekspert
25. august 2006 - 02:22 #8
Man bør aldrig aldrig aldrig bruge float/double til beløb. Altid numeric/decimal.
Avatar billede arne_v Ekspert
25. august 2006 - 02:38 #9
Se f.eks. følgende eksempel - yderst logisk for enhver programmør, men vil give
et hjerteanfald hos enhver bogholder:

mysql> CREATE TABLE fproblem (id INT PRIMARY KEY,x FLOAT(12,2));
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> INSERT INTO fproblem VALUES (1, 1000000000);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT x FROM fproblem WHERE id=1;
+---------------+
| x            |
+---------------+
| 1000000000.00 |
+---------------+
1 row in set (0.00 sec)

mysql>
mysql> UPDATE fproblem SET x=x+1000 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>
mysql> SELECT x FROM fproblem WHERE id=1;
+---------------+
| x            |
+---------------+
| 1000001024.00 |
+---------------+
1 row in set (0.00 sec)

mysql>
mysql> DROP TABLE fproblem;
Query OK, 0 rows affected (0.00 sec)
Avatar billede razmuz_dk Nybegynder
25. august 2006 - 09:08 #10
... har lige nærstuderet min gamle mysql-bog, og jeg må jo nok indrømme at arne har ret. Jeg beklager mit fejlagtige svar :( Hvis du skal bruge "store tal" så er decimal den sikre vej. Grunden til at din program anbefaler double som datatype er måske, at den bedømmer, at double er præcist nok til dine tal (double er mere præcist end float).

I øvrigt, det kan være arne kan forklare hvor mysql anbefaler 4 decimaler på "beløb-kolonner" (han pjejer at have svar på alt), eftersom mit svar (24/08-2006 14:36:05) er lidt tvivlsomt?
Avatar billede torotune Nybegynder
25. august 2006 - 16:46 #11
Hej igen,

Okay, vigtigt nok. Så det vil sige noget i retning af at float regner som om den havde med Bytes/MBytes at gøre?

Så decimal er den optimale løsning - men ja, forstår stadig heller ikke de 4 nuller, er det et spørgsmål om at få det så præcist som muligt, og så må man selv sørge for at formatere outputtet med 2 decimaler når det skal vises?
Avatar billede arne_v Ekspert
25. august 2006 - 17:15 #12
nej - de 1024 er et tilfaelde - det kunne lige saa godt have vaeret 993
eller 1009 - pointen er at FLOAT og DOUBLE har lidt usikkerhed - det er
helt fint til mange fysiske maal (det giver ikke mening at diskutere om
man har 15 km til arbejde eller 15.00001 km til arbejde), men til kroner og
oere kan det godt faa bogholdere og revisorer op af stolene
Avatar billede arne_v Ekspert
25. august 2006 - 17:18 #13
Der er en eller anden tradition for at bruge op til 4 decimaler paa beloeb.

Access currency understoetter ogsaa op til 4 decimaler.

Alle civiliserede lande bruger mig bekendt kun 2 decimaler.
Avatar billede torotune Nybegynder
25. august 2006 - 17:46 #14
Ah oky. - Vidste slet ikke at unøjagtigheder kunne forekomme på den måde. Så der er ingen far for at lave en DECIMAL(9,2) så længe det er DKK der regnes med. Men læg et svar også, så blev både razmuz_dk og jeg belært ud i talmagi :-)
Avatar billede arne_v Ekspert
26. august 2006 - 02:21 #15
svar
Avatar billede arne_v Ekspert
26. august 2006 - 02:26 #16
iøvrigt er 993 og 1009 ikke så sandsynelige som 1024 da det skal være en sum af
potenser af 2

+10000 giver 9984 (som er 8192 + 1024 + 512 + 256)

men på det overfladiske niveau så er der bare støj på de sidste decimaler
Avatar billede torotune Nybegynder
27. august 2006 - 22:26 #17
Okay. Jeg synes det er bemærkelsesværdigt nok at der i udviklingen er blevet tolereret de her unøjagtigheder og at de kan forekomme. - Men det er måske noget man har accepteret for at presse performance og space ned på et minimumsniveau? Jeg mener bare, man har da  altid været af den overbevisning at et apperat som en computer altid regner præcist ned til sidste decimal :-)
Avatar billede arne_v Ekspert
27. august 2006 - 23:04 #18
Mange har aldrig helt forstået floating point.

De har aldrig opført sig som fixed point og kommer heller aldrig til det.

Der er store fordele ved dem: de kan dække et utroligt stort range med en
relativ usikkerhed som er uafhængig af den absolutte værdi med data som
ikke fylder ret meget.

Og så er der nogen enkelte ulemper.

Et floating point tal kan dække så små tal som 10^-38 og så store tal som 10^38 i 4 byte.

En tilsvarende fixed point tal ville bruge ca. 32 bytes.
Avatar billede arne_v Ekspert
27. august 2006 - 23:05 #19
Og floating point er helt fine til afstande, vægt etc..

Men absolut ikke til beløb.
Avatar billede torotune Nybegynder
28. august 2006 - 11:13 #20
Fantastisk.. Jeg takker for hjælpen denne gang, og smider lige lidt ekstra points af. :-)
Avatar billede torotune Nybegynder
29. august 2006 - 22:32 #21
Hov lige en sidste, hvis nogen stadig hænger på.. Er DECIMAL at foretrække som datatype for valuta i alle de gængse databaser? (MsSQL, Access, Oracle osv.) ?
Avatar billede arne_v Ekspert
29. august 2006 - 22:52 #22
Ja.

(nogen database kalder faktisk typen for CURRENCY eller MONEY, men det er
samme concept)

Egenskaberne ved floating point er helt universielle og gaelder alle
CPU'er, styre systemer, programmerings sprog, databaser etc..
Avatar billede torotune Nybegynder
01. september 2006 - 13:58 #23
Okay fint. - Tak for det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester