En MySQL 5.0.3, se hicieron varios cambios en distintos aspectos
del tipo de datos DECIMAL
(y sus sinónimos):
Numero máximo de dígitos
Formato de almacenamiento
Requerimientos de almacenamiento
Las extensiones MySQL no estándar al rango superior de
columnas DECIMAL
Algunos de los cambios provocan posibles incompatibilidades para aplicaciones escritas en versiones antiguas de MySQL. Estas incompatibilidades se muestran durante esta sección.
La sintaxis de declaración para columnas
DECIMAL
sigue siendo
DECIMAL(
,
aunque el rango de valores para los argumentos ha cambiado algo:
M
,D
)
M
es el número máximo de dígitos
(la precisión). Tiene un rango de 1 a 64. Introduce una
posible incompatibilidad para aplicaciones antiguas, ya que
versiones prévias de MySQL permiten el rango de 1 a 254.
D
es el número de dígitos a la
derecha del punto decimal (la escala). Tiene el rango de 0 a
30 y no debe ser mayor que M
.
El valor máximo de 64 para M
significa
que los cálculos con valores DECIMAL
son
precisos hasta 64 dígitos. Este límite de 64 dígitos de
precisión también se aplica a literales con valor exacto, así
que el rango máximo de tales literales es diferente al anterior.
(Antes de MySQL 5.0.3, los valores decimales podían tener hasta
254 dígitos. Sin embargo, los cálculos se hacían usando coma
flotanto y por lo tanto eran aproximados, no exactos.) Este cambio
en el rango de valores literales es otra posible fuente de
incompatibilidades para aplicaciones antiguas.
Los valores para columnas DECIMAL
no se
representan como cadenas que requieren un byte por dígito o
carácter de signo. En su lugar, se usa un formato binario que
empaqueta nueve dítigos decimales en cuatro bytes. Este cambio
del formato de almacenamiento de DECIMAL
cambia
los requerimientos de almacenamiento también. El almacenamiento
para las partes enteras y fraccionales de cada valor se determinan
por separado. Cada múltiple de nueve dígitos necesita cuatro
bytes, y los dígitos restantes necesitan una fracción de cuatro
bytes. Por ejemplo, una columna DECIMAL(18,9)
tiene nueve dígitos en cada parte del punto decimal, así que la
parte entera y fraccional necesitan cuatro bytes cada una. Una
columna DECIMAL(20,10)
tiene 10 dígitos en
cada lado del punto decimal. Cada parte requiere cuatro bytes para
nueve de los dígitos, y un byte para el dígito restante.
El almacenamiento requerido para los dígitos restantes lo da la siguiente tabla:
Dígitos | Número |
Restantes | de Bytes |
0 | 0 |
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
5 | 3 |
6 | 3 |
7 | 4 |
8 | 4 |
9 | 4 |
Como resultado del cambio de cadena de caracteres a formato
numérico para almacenamiento DECIMAL
, las
columnas DECIMAL
no necesitan un carácter
'+
' o dígito '0
'
precedente. Antes de MySQL 5.0.3, si insertaba
'+0003.1'
en una columna
DECIMAL(5,1)
, se almacenaría como
+0003.1
. Desde MySQL 5.0.3, se almacena como
3.1
. Aplicaciones que confían en el antiguo
comportamiento deben modificarse teniendo en cuenta este cambio.
El cambio de formato de almacenamiento también significa que las
columnas DECIMAL
no soportan la extensión no
estándar que permitía valores mayores que el rango implicado por
la definición de la columna. Antiguamente, se reservaba un byte
para almacenar el carácter de signo. Para valores positivos que
no necesitaban byte de signo, MySQL permitía almacenar un byte
extra. Por ejemplo, una columna DECIMAL(3,0)
debe soportar un rango de al menos -
999 a
999
, pero MySQL debería permetir almacenar
valores de 1000
a 9999
también, usando el byte de signo para almacenar un dígito extra.
Esta extensión del rango superior de las columnas
DECIMAL
no se permite. En MySQL 5.0.3 y
posteriores, una columna
DECIMAL(
permite como mucho
M
,D
)M
−D
dígitos a la izquierda del punto decimal. Esto puede resultar en
una incompatibilidad si una aplicación tiene confianza en que
MySQL permita valores "demasiado grandes".
El estándar SQL requiere que la precisión de
NUMERIC(
sean exactamente M
,D
)M
dígitos. Para
DECIMAL(
,
requiere una precisión de al menos M
,D
)M
dígitos, pero permite más. En MySQL,
DECIMAL(
y
M
,D
)NUMERIC(
son los mismo y ambos tienen una precisión de exactamente
M
,D
)M
dígitos.
Resumen de incompatibilidades:
La siguiente lista resume las incompatibilidades resultantes de
cambios de la columna DECIMAL
y tratamiento de
valores. Puede usarla como guía cuando al portar aplicaciones
antiguas para usar con MySQL 5.0.3 y posteriores.
Para
DECIMAL(
,
el máximo M
,D
)M
es 64, no 254.
Los cálculos que implican valores decimales con valores exactos son precisos hasta 64 dígitos. Esto es menor que el número máximo de dígitos permitidos antes de MySQL 5.0.3 (254 dígitos), pero la precisión exacta es mayor. Los cálculos anteriormente se hacían con punto flotante de doble precisión, que tiene una precisión de 52 bits (acerca de 15 dígitos decimales).
La extensión no estándar MySQL del rango superior de
columnas DECIMAL
no se soporta.
Los caracteres precedentes '+
' y
'0
' no se almacenan.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.