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.

