¿Cómo usar MySQL DECIMAL?

177

No puedo entender el DECIMAL de MySQL. Necesito que la fila pueda contener un número entre 00.0001 y 99.9999. ¿Cómo lo estructuraría para que funcione así?

Charles Zink
fuente
44
Realmente deberías aceptar la respuesta correcta. La respuesta actualmente aceptada es incorrecta.
Olhovsky
2
Terminé aquí y leí la respuesta alegando que DECIMAL SIN FIRMAR no es posible. Vea la nueva respuesta a continuación para conocer las especificaciones correctas para esto.
Markus AO

Respuestas:

439

Las columnas DOBLES no son lo mismo que las columnas DECIMALES, y usted tendrá problemas si usa columnas DOBLES para datos financieros.

DOUBLE es en realidad una versión de FLOAT de doble precisión (64 bits en lugar de 32 bits) . Los números en coma flotante son representaciones aproximadas de números reales y no son exactos. De hecho, los números simples como 0.01 no tienen una representación exacta en los tipos FLOTANTE o DOBLE.

Las columnas DECIMAL son representaciones exactas, pero ocupan mucho más espacio para un rango mucho más pequeño de números posibles. Para crear una columna capaz de contener valores de 0.0001 a 99.9999 como usted pidió, necesitaría la siguiente declaración

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

La definición de columna sigue el formato DECIMAL (M, D) donde M es el número máximo de dígitos (la precisión ) y D es el número de dígitos a la derecha del punto decimal (la escala ).

Esto significa que el comando anterior crea una columna que acepta valores de -99.9999 a 99.9999. También puede crear una columna DECIMAL NO FIRMADA, que oscila entre 0.0000 y 99.9999.

Para obtener más información sobre MySQL DECIMAL, los documentos oficiales son siempre un gran recurso.

Tenga en cuenta que toda esta información es cierta para las versiones de MySQL 5.0.3 y posteriores. Si está utilizando versiones anteriores, realmente debería actualizar.

Alex Recarey
fuente
17
Votó su respuesta. Su respuesta es correcta, la otra respuesta no lo es (ya que afirma que "doble = decimal"). DECIMAL es un tipo de punto fijo con un valor exacto y sus sinónimos son NUMERIC, DEC y FIXED. No DOUBLE, porque DOUBLE es un tipo de punto flotante que representa valores de datos numéricos aproximados. Cuando se usa DECIMAL (<1-65>, <0-30>), el primer parámetro es el número de dígitos, el segundo el número de dígitos a la derecha del punto decimal.
Norbert
2
Sí, tiene usted razón. Tome en cuenta que es un trabajo para MySQL 5.0.3 en adelante, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal
1
El póster solicitó un campo decimal que contenía valores entre 0.0001 y 99.9999. Agregué información adicional para aclarar que el campo creado en realidad admite valores de -99.9999 a 99.9999. ¡Gracias por la respuesta! También se agregó el descargo de responsabilidad de la versión de MySQL.
Alex Recarey
1
Dijiste "No hay forma de crear una columna DECIMAL" sin firmar ", pero tu ejemplo de código indica" DECIMAL (6,4) SIN FIRMAR NO NULO ". ¿Por qué es esto?
liang
3
@AlexRecarey Parece que puedo crear un DECIMAL SIN FIRMAR muy bien; y el manual de MySQL 5.x de acuerdo: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Devolverá un error fuera de rango para valores negativos. También puede crear FLOAT y DOUBLE sin firmar. Manual: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO
67

Aunque las respuestas anteriores parecen correctas, solo una explicación simple para darle una idea de cómo funciona.

Suponga que su columna está configurada para ser DECIMAL(13,4). Esto significa que la columna tendrá un tamaño total de 13 dígitos, donde 4 de estos se utilizarán para la representación de precisión.

Entonces, en resumen, para esa columna tendría un valor máximo de: 999999999.9999

Cristiano
fuente
1
mejor respuesta aquí
Julian Silvestri
15

Hay soluciones correctas en los comentarios, pero para resumirlas en una sola respuesta:

Tienes que usar DECIMAL (6,4).

Entonces puede tener 6 números totales de dígitos, 2 antes y 4 después del punto decimal (la escala). Al menos según esto .

Zoltán Hajdú
fuente
6

MySQL 5.x especificación de tipo de datos decimal es: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. La respuesta anterior es incorrecta al decir que los decimales sin signo no son posibles.

Para definir un campo permitiendo que sólo los decimales sin signo, con una longitud total de 6 dígitos, 4 de las cuales son decimales, se debería utilizar: DECIMAL (6,4) UNSIGNED.

También puede crear tipos de datos FLOAT y DOUBLE sin signo (es decir, no negativos).

Markus AO
fuente