Come usare MySQL DECIMAL?


177

Non riesco proprio a capire il DECIMAL di MySQL. Ho bisogno che la riga sia in grado di contenere un numero ovunque da 00.0001 a 99.9999. Come lo strutturerei per funzionare così?



4
Dovresti davvero accettare la risposta corretta. La risposta attualmente accettata è errata.
Olhovsky,

2
Finito qui e leggi la risposta affermando che DECIMAL UNSIGNED non è possibile. Vedere la nuova risposta di seguito per le specifiche corrette per questo.
Markus AO,

Risposte:


440

Le colonne DOUBLE non sono le stesse delle colonne DECIMAL e potresti avere problemi se usi le colonne DOUBLE 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 numeri reali e non sono esatti. In effetti, 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 un intervallo molto più piccolo di possibili numeri. Per creare una colonna in grado di contenere valori compresi tra 0,0001 e 99,9999 come richiesto, è necessario disporre della seguente istruzione

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

La definizione di colonna segue il formato DECIMAL (M, D) dove M è il numero massimo di cifre (la precisione ) e D è il numero di cifre a destra del punto 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, compresa tra 0,0000 e 99,9999.

Per ulteriori informazioni su MySQL DECIMAL, i documenti ufficiali sono sempre un'ottima risorsa.

Tieni presente che tutte queste informazioni sono vere per le versioni di MySQL 5.0.3 e successive. Se si utilizzano versioni precedenti, è necessario aggiornare.


17
Votata la tua risposta. La tua risposta è corretta, l'altra risposta no (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 DOPPIO, perché DOPPIO è un tipo a virgola mobile che rappresenta valori numerici approssimativi dei dati. 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
Si hai ragione. Prendi nota che funziona per MySQL 5.0.3 in poi, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal

1
Il poster ha richiesto un campo decimale che contenesse valori compresi tra 0,0001 e 99,9999. Ho aggiunto alcune informazioni aggiuntive per chiarire che il campo creato in realtà supporta valori compresi tra -99.9999 e 99.9999. Grazie per il feedback! Aggiunta anche la dichiarazione di non responsabilità della versione di MySQL.
Alex Recarey,

1
Hai detto "Non c'è modo di creare una colonna DECIMAL" senza segno ", ma il tuo esempio di codice indica" DECIMAL (6,4) UNSIGNED NOT NULL ". Perchè è questo?
liang,

3
@AlexRecarey Mi sembra di poter creare un DECIMAL UNSIGNED proprio bene; e il manuale per MySQL 5.x è d'accordo: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Restituirà un errore fuori range per valori negativi. Puoi anche creare FLOAT e DOUBLE non firmati. Manuale: dev.mysql.com/doc/refman/5.0/it/numeric-type-overview.html
Markus AO

68

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

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

Quindi, in sintesi, per quella colonna avresti un valore massimo di: 999999999.9999


1
migliore risposta qui
Julian Silvestri,

15

Esistono soluzioni corrette nei commenti, ma per riassumere in un'unica risposta:

Devi usare DECIMAL (6,4).

Quindi puoi avere 6 numero totale di cifre, 2 prima e 4 dopo il punto decimale (la scala). Almeno secondo questo .


6

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

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

Puoi anche creare tipi di dati FLOAT e DOUBLE non firmati (cioè non negativi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.