Volver a la lista de artículos Artículos
Lectura de 10 minutos

Explicación sobre los tipos de datos numéricos de SQL

Trabajar con bases de datos de cualquier tipo significa trabajar con datos. Estos datos pueden tener un par de formatos predefinidos. A medida que avance en su aprendizaje con LearnSQL.es, empezará a entender los diferentes tipos de datos de SQL. En este artículo, cubriremos las diferentes variaciones del tipo de datos numérico de SQL. También mostraremos algunas funciones que convierten los datos de un tipo a otro.

La creación de tablas es el primer paso en todo proyecto de código SQL. Para ello, se utilizan instrucciones DDL (lenguaje de definición de datos) como CREATE y DROP, que explicamos en nuestro curso Cómo crear tablas en SQL. Cuando haya creado su tabla, empiece a declarar los nombres de las columnas y los tipos de datos en SQL. Los tipos de datos indican a la base de datos qué tipo de información debe esperar para esa columna.

Digamos que tenemos la tabla "usuarios". La información de cada usuario está en las columnas para el nombre y para el número de teléfono. Los nombres se almacenarían en una columna para caracteres, y los números de teléfono en una columna numérica. Entonces, las columnas numéricas almacenan números y todos los números son iguales, ¿verdad? Pues no.

Hay diferentes tipos de números, y hay diferentes tipos de columnas numéricas. Cualquiera que tenga conocimientos de estadística sabe que hay cuatro escalas diferentes que se aplican a los números: nominal, ordinal, de intervalo y ratio. A diferencia de los otros tipos de datos, los tipos numéricos pueden representar todas estas escalas (por eso, en lugar de hablar de tipo de datos numéricos en SQL, hablamos de tipos). Pero, ¿en qué se diferencian estas escalas entre sí?

  • Los valores nominales solo se diferencian por su "nombre". Los valores nominales no se tratan como números; no se pueden sumar ni restar, y no tienen un orden inherente. Por ejemplo, los números de ID de los estudiantes y los números de teléfono son valores nominales. Se utilizan más como una etiqueta que como un número. Podemos decir que nuestros números de teléfono son iguales (misma importancia, misma longitud), pero no podemos compararlos ni decir que uno de ellos es el primero. No podemos sumarlos para obtener un número de teléfono significativo.
  • Los valores ordinales proporcionan un orden o rango. En los valores ordinales, lo importante es el orden que existe entre ellos. Supongamos que tenemos una escala de 1 a 3 que califica el estado de ánimo de una persona. "1" significaría sentirse infeliz, "2" estar contento y "3" estar feliz. Se sabe que "feliz" tiene un valor más alto que "contento" o "infeliz", pero eso es todo. No se puede sumar "contento" e "infeliz" para obtener un "feliz".
  • Los valores de intervalo muestran las diferencias exactas. En una escala de intervalos, lo importante son las diferencias entre los valores. Si se resta 90 grados centígrados de 100 grados centígrados, se obtiene una diferencia de 10 grados. Los años, las fechas y la mayoría de las medidas de las personas son medidas de intervalo. Los valores de intervalo son numéricos y se representan como tales en la base de datos.
  • Los valores ratio son intervalos con un valor cero definido. Al igual que en las escalas de intervalo, en las escalas ratio las diferencias entre los valores son calculables. Sin embargo, en estas escalas, el valor cero significa que no hay nada que medir. Por ejemplo, si pensamos en términos de masa, longitud y duración, si cualquiera de ellas tiene un valor cero, no hay nada. Las escalas ratio son muy importantes para la ciencia.

Todos los tipos de datos numéricos de SQL se utilizan para representar todos los valores anteriores, especialmente los intervalos y los ratios. Se pueden comparar los valores de los caracteres en SQL, por lo que es posible argumentar que los valores de los caracteres también podrían representar datos de intervalo. Sin embargo, ese es un tema para otro artículo.

En SQL, los números se definen como exactos o aproximados.

Los tipos de datos numéricos exactos son SMALLINT, INTEGER, BIGINT, NUMERIC(p,s) y DECIMAL(p,s). Cuando se usa el tipo de dato numérico exacto en SQL, significa que el valor se almacena como una representación literal del valor del número.

Los tipos de datos numéricos aproximados son FLOAT(p), REAL y DOUBLE PRECISION. Representan números reales, pero no se escriben como números exactos en la base de datos. Más bien, son una aproximación al número real, debido a la forma en que los sistemas informáticos representan los números. Si esto le parece confuso, no se preocupe, se lo explicaremos detalladamente más adelante.

Vamos a comenzar nuestra explicación sobre los tipos numéricos de SQL con los tipos de datos exactos o numéricos.

Tipos de datos numéricos de SQL

Los tipos de datos numéricos exactos de SQL están formados por los subtipos NUMERIC(p,s) y DECIMAL(p,s). Son números exactos, y los definimos por su precisión (p) y escala (s). La precisión es un número entero que representa el número total de dígitos permitidos en esta columna. Estos dígitos están en una base de tipos numéricos (radix) específica, es decir, binaria (base 2) o decimal (base 10), y suelen conllevar un punto decimal. La escala también es un valor entero y representa el número de decimales a la derecha (si es positivo) o a la izquierda (si es negativo, esto no se suele usar) del punto decimal.

Veamos un ejemplo. Supongamos que hemos definido que la columna "saldo" es NUMERIC con una precisión de 8 y una escala de 2.

La instrucción DDL sería la siguiente:

CREATE TABLE cuenta (
noCuenta integer,
saldo numeric(8,2)
);

La columna "saldo" podría almacenar con seguridad el número 173226.62.

Tipos de datos numéricos y decimales de SQL

P representa el número total de todos los dígitos y, s, los dos dígitos después del punto decimal.

Existe una pequeña diferencia entre los tipos de datos numéricos NUMERIC(p,s) y DECIMAL(p,s) de SQL. NUMERIC determina la precisión y la escala exactas. DECIMAL especifica solo la escala exacta; su precisión es igual o mayor que la especificada por el programador. Las columnas DECIMAL pueden tener una precisión mayor que la especificada si esto es más conveniente o eficiente para el sistema de la base de datos.

En otras palabras, DECIMAL da cierto margen de maniobra.

Tenga en cuenta que los datos financieros, como los saldos de las cuentas, se deben almacenar como tipos de datos NUMERIC o DECIMAL.

Además, sea consciente de que muchos de los principales sistemas de gestión de bases de datos tienen representaciones específicas del proveedor para los tipos de datos numéricos (por ejemplo, el tipo de datos NUMBER de Oracle). Estos sistemas no suelen diferenciar entre los tipos NUMERIC y DECIMAL (en Oracle, ambos se encuentran encuadrados en el tipo NUMBER).

Errores comunes con los valores de tipo numérico

Cuando inserte datos en una columna NUMERIC, recuerde sus límites de precisión. Si intenta insertar un número demasiado grande, es posible que obtenga un error. Por ejemplo, si queremos insertar lo siguiente:

INSERT INTO cuenta(noCuenta, saldo) VALUES(1313,12331411.23);

Esto producirá un error. ¿Por qué? Vamos a intentarlo de nuevo con un número similar:

INSERT INTO cuenta(noCuenta, saldo) VALUES(1313,123314.1123);

El segundo intento funciona. Esto se debe a que el RDBMS redondea el número insertado, descartando cualquier dígito "extra" que esté a la derecha del punto decimal. En este caso, se mantiene ".11", pero se descarta el "23" siguiente. Tenga en cuenta que, si el valor del primer dígito descartado es 5 o más, el RDBMS redondeará el dígito que está a su izquierda.

En nuestro ejemplo, eso significaría que si se lanza la siguiente instrucción:

INSERT INTO cuenta(noCuenta, saldo) VALUES(1313,123314.1153);

...el saldo guardado en la base de datos sería 123314.12.

Para saber más sobre el redondeo y las funciones numéricas más comunes, consulte el curso SQL para principiantes.

Los tipos de datos enteros

Los tipos de datos enteros (integer) contienen números enteros o sin punto decimal. En latín, integer significa entero. El estándar ANSI SQL define SMALLINT, INTEGER y BIGINT como tipos de datos enteros. La diferencia entre estos tipos es el tamaño del número que pueden almacenar.

A continuación, podemos ver la definición de Microsoft SQL de varios tipos de datos enteros:

Tipo de datos Intervalo Almacenamiento
bigint -2^63 (-9,223,372,036,854,775,808) a 2^63-1 (9,223,372,036,854,775,807) 8 bytes
int -2^31 (-2,147,483,648) a 2^31-1 (2,147,483,647) 4 bytes
smallint -2^15 (-32,768) a 2^15-1 (32,767) 2 bytes
tinyint 0 a 255 1 byte

Para estos tipos, el tamaño predeterminado de la columna es importante. Definir un tamaño de columna menor para los tipos enteros más pequeños (si se conoce con antelación el tamaño máximo) puede ayudar a mantener las tablas lo más pequeñas posible.

Errores comunes con los tipos enteros

Las columnas INTEGER redondean los decimales. Para explicarlo, vamos a modificar un poco nuestra tabla:

CREATE TABLE cuenta (
noCuenta integer,
saldo integer
);

Si ejecutamos esta instrucción:

INSERT INTO cuenta(noCuenta, saldo) VALUES(1313,123314.3153);

... los valores insertados se redondearían al primer dígito antes del punto decimal. Supongamos que insertamos 123314,5 en la columna de saldo:

INSERT INTO cuenta(noCuenta, saldo) VALUES(1313,123314.5);

Como cambiamos el valor de atrás del punto decimal a un valor igual o mayor que 5, obtendríamos 123315.

Si usted utiliza tipos de datos enteros en las fórmulas, debe saber que el redondeo puede causar inconsistencias en las fórmulas. Si se hace la operación 123314.3153+123314.3153:

INSERT INTO cuenta(noCuenta, saldo)    VALUES(1313,123314.3153+123314.3153);

.. el valor insertado sería 123314. Y, si se resta uno de los valores que sumamos antes en el saldo:

SELECT SALDO - 123314.3153 FROM cuenta; 

... el resultado, ahora un número decimal, sería 123314.3147. Esto es una clara incoherencia. Esto se puede evitar definiendo para las columnas los tipos de datos adecuados para las operaciones que se vayan a realizar en ellas.

Los tipos de datos float

Los tipos de datos numéricos float y relacionados con float de SQL contienen valores numéricos aproximados. Constan de una cifra significativa (un valor numérico con signo) y un exponente (un valor entero con signo que especifica el orden de magnitud de la cifra significativa). Estos tipos de datos tienen una precisión, o un entero positivo que define el número de cifras significativas (exponente de la base del número).

Este tipo de representación de datos se denomina normalmente representación con punto flotante.

Si quisiésemos representar 173226,62 en esta notación (con base 10), lo haríamos así:

Tipo de datos decimales en SQL

El valor de un valor numérico aproximado es su cifra significativa multiplicada por 10 elevada a un exponente.

Si quiere entender realmente el tipo de datos numéricos de punto flotante de SQL, tendrá que estudiar un poco de ciencia de la computación. Es posible que lo encuentre divertido, pero, en esta etapa de su aprendizaje de SQL, creo que es excesivo. Por ahora, solo recuerde que hay tres tipos de números aproximados en SQL de la forma ANSI estándar: FLOAT(p) REAL y DOUBLE PRECISION.

La diferencia entre FLOAT(p) y REAL es que FLOAT tiene una precisión binaria (no decimal) igual o mayor que el valor definido. La precisión predefinida de REAL se basa en la base de datos usada. En el ámbito laboral normal, FLOAT no se suele utilizar, y REAL y DOUBLE PRECISION están ligados a implementaciones específicas del sistema, y los desarrolladores tienden a pasar el trabajo de implementación del sistema a los administradores de bases de datos (DBA) y a los administradores de sistemas.

La diferencia entre REAL y DOUBLE PRECISION es que REAL representa números de 34 bits y DOUBLE PRECISION de 64 bits.

Cómo trabajar con los tipos aproximados

Creo que es muy importante recordar que este tipo de datos numéricos de SQL sacrifica la precisión por el rango, de ahí el nombre de aproximado.

En los cálculos, los tipos aproximados pueden dar resultados extraños como 204.000000056, cuando el resultado exacto debería ser 204. Si se está creando una base de datos para una aplicación de ingeniería o científica, los tipos de datos flotantes valdrían. También, hay una diferencia de velocidad; si se está haciendo un número excepcionalmente alto de cálculos complicados (por ejemplo, funciones trigonométricas, etc.), estos serían mucho más rápidos con tipos flotantes que con el resto de tipos de datos numéricos. Por otro lado, si se está trabajando en una aplicación financiera, bancaria o de otro tipo, lo más apropiado es utilizar la representación decimal.

El catálogo de tipos de datos numéricos de SQL no se limita a los enteros y decimales. Estos solo son un reflejo de la necesidad de almacenar los datos de forma segura, predecible y utilizable. Como en cualquier lenguaje de programación, nos recuerdan el aspecto informático de las bases de datos y de SQL.

Si quiere practicar con todos los tipos de datos numéricos de SQL y conocer sus posibilidades, uso, restricciones y errores comunes, vaya a LearnSQL.es ¡y diviértase!