2011-01-29 19 views
122

Non riesco a capire perfettamente DECIMAL di MySQL. Ho bisogno che la riga contenga un numero ovunque tra 00.0001 e 99.9999. Come lo strutturerei per funzionare in questo modo?Come usare MySQL DECIMAL?

+8

* (Riferimento) * http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html –

+4

È necessario accettare la risposta corretta. La risposta attualmente accettata è errata. – Olhovsky

+2

Finito qui e leggi la risposta sostenendo che DECIMAL UNSIGNED non è possibile. Vedere la nuova risposta sotto per le specifiche corrette per questo. –

risposta

344

colonne doppie sono non lo stesso come colonne decimale e si otterrà nei guai se si utilizzano le colonne doppie per i dati finanziari.

DOUBLE è in realtà solo una versione a doppia precisione (64 bit anziché 32 bit) di FLOAT. I numeri in virgola mobile sono rappresentazioni approssimative di real numbers e non sono esatti. Infatti, numeri semplici come 0,01 non hanno una rappresentazione esatta nei tipi FLOAT o DOUBLE.

Le colonne DECIMAL sono rappresentazioni esatte, ma occupano molto più spazio per una gamma molto più piccola di numeri possibili. Per creare una colonna in grado di contenere valori da 0,0001-99,9999 come hai chiesto si avrebbe bisogno la seguente dichiarazione

CREATE TABLE your_table 
(
    your_column DECIMAL(6,4) NOT NULL 
); 

La definizione della colonna segue il formato decimale (M, D), dove M è il numero massimo di cifre (la precisione ) e D è il numero di cifre a destra della virgola decimale (la scala ).

Ciò significa che il comando precedente crea una colonna che accetta valori compresi tra -99.9999 e 99.9999. È inoltre possibile creare una colonna DECIMALE UNSIGNED, che va da 0,0000 a 99,9999.

Per ulteriori informazioni su MySQL DECIMAL, lo official docs è sempre un'ottima risorsa.

Ricordare che tutte queste informazioni sono valide per le versioni di MySQL 5.0.3 e successive. Se si utilizzano versioni precedenti, è necessario eseguire l'aggiornamento.

+15

Votato la tua risposta. La tua risposta è corretta, l'altra risposta non lo è (poiché afferma che "double = decimal"). DECIMAL è un tipo a virgola fissa con un valore esatto e i suoi sinonimi sono NUMERIC, DEC e FIXED. Non DOUBLE, perché DOUBLE è un tipo a virgola mobile che rappresenta valori di dati numerici approssimativi. Quando si utilizza DECIMAL (<1-65>, <0-30>), il primo parametro è il numero di cifre, il secondo il numero di cifre a destra del punto decimale. – Norbert

+2

Sì, hai ragione. Prendi nota che funziona per MySQL 5.0.3 in poi, http://dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html – ajreal

+0

@ajreal - potresti modificare la tua risposta di conseguenza? Grazie in anticipo. – dezso

5

MySQL 5.x specification per il tipo di dati decimale: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. La risposta sopra è sbagliata nel dire che i decimali non firmati non sono possibili.

Per definire un campo che consente solo decimali senza segno, con una lunghezza totale di 6 cifre, di cui 4 decimali, si utilizzerà: DECIMAL (6,4) UNSIGNED.

È inoltre possibile creare tipi di dati FLOAT e DOUBLE senza segno (cioè non negativi).

32

Anche se le risposte sopra sembrano corrette, solo una semplice spiegazione per darti un'idea di come funziona.

Supponiamo che la colonna sia impostata su DECIMAL(13,4). Ciò significa che la colonna avrà una dimensione totale di 13 cifre in cui 4 di questi verranno utilizzati per la rappresentazione di precisione.

Così, in sintesi, per quella colonna si avrebbe un valore massimo di: 999999999,9999

7

Ci sono soluzioni giuste nei commenti, ma li riassumono in una sola risposta:

Devi usare DECIMAL (6,4).

Quindi è possibile avere 6 numeri totali di cifre, 2 prima e 4 dopo il punto decimale (la scala). Almeno secondo this.

+1

Questo mi ha aiutato a capire completamente questo concetto. –