23.2. Cambios en el tipo de datos DECIMAL

MySQL 5.0

23.2. Cambios en el tipo de datos DECIMAL

En MySQL 5.0.3, se hicieron varios cambios en distintos aspectos del tipo de datos (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

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 sigue siendo ,), aunque el rango de valores para los argumentos ha cambiado algo:

  • 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.

  • 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 .

El valor máximo de 64 para significa que los cálculos con valores 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 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 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 tiene nueve dígitos en cada parte del punto decimal, así que la parte entera y fraccional necesitan cuatro bytes cada una. Una columna 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 carácteres a formato numérico para almacenamiento , las columnas no necesitan un carácter '' o dígito '' precedente. Antes de MySQL 5.0.3, si insertaba en una columna , se almacenaría como . Desde MySQL 5.0.3, se almacena como . 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 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 debe soportar un rango de al menos 999 a , pero MySQL debería permetir almacenar valores de a también, usando el byte de signo para almacenar un dígito extra. Esta extensión del rango superior de las columnas no se permite. En MySQL 5.0.3 y posteriores, una columna ,) permite como mucho 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 ,) sean exactamente dígitos. Para ,), requiere una precisión de al menos dígitos, pero permite más. En MySQL, ,) y ,) son los mismo y ambos tienen una precisión de exactamente dígitos.

Resumen de incompatibilidades:

La siguiente lista resume las incompatibilidades resultantes de cambios de la columna y tratamiento de valores. Puede usarla como guía cuando al portar aplicaciones antiguas para usar con MySQL 5.0.3 y posteriores.

  • Para ,), el máximo 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ándard MySQL del rango superior de columnas no se soporta.

  • Los carácteres precedentes '' y '' no se almacenan.