SQL maneja básicamente seis tipos de datos:
Numéricos exactos (exact numerics)
Existen cuatro tipos de datos en esta categoría:
- INTEGER: No tiene parte fraccional y su precisión (el número máximo de dígitos que puede tener) depende de la implementación.
- SMALLINT: También es para enteros. Su precisión también depende de la implementación pero no puede ser mayor (aunque puede ser igual) que la precisión de un INTEGER.
- NUMERIC: Puede tener parte fraccional. Se puede especifricar la precisión y la escala (scale - el número de dígitos en la parte fraccional). Si no se especifica la precisión o la precisión ni la escala, entonces se tienen los valores por omisión de la implementación.
- DECIMAL: Es similar al NUMERIC, pero con mayor precisión. Puede almacenar valores con mayor precisión que la especificada en caso de ser necesario.
Numéricos aproximados (approximate numerics)
Existen tres tipos de datos:
REAL: Números de punto flotante (mantisa y exponente) de precisión simple, la cual depende de la implementación.
DOUBLE PRECISION: Números de punto flotante de doble precisión, la cual también depende de la implementación. En algunos casos es el doble en mantisa y en exponente, en otros casos es algo cercano al doble y en otros casos es sólo el doble en la mantisa. El estándar sólo establece que la precisión de un DOUBLE PRECISION sea mayor a la de un REAL. FLOAT: Número de punto flotante que permite especificar la precisión deseada. Dependiendo de la implementación y de la precisión especificada se utiliza aritmética de precisión simple o de doble precisión. Cadenas de caracteres (character strings)
Existen dos tipos principales:
CHARACTER o CHAR: Para cadenas de caracteres de tamaÒo fijo. Se debe especificar el número máximo de caracteres. El tamaÒo restante, en caso de no ocupar la longitud máxima, se rellena con espacios. en caso de no especificar un número de caracteres, entonces se toma el valor por omisión, que es de un caracter.
CHARACTER VARYING o VARCHAR: Para cadenas de caracteres de tamaÒo variable. Este tipo es útil cuando se quieren cadenas de longitud variable pero sin que se rellene de espacios el tamaÒo restante, guardando solamente los caracteres deseados. También permite especificar un número máximo de caracteres. Existen además dos variantes de estos tipos de datos: NATIONAL CHARACTER y NATIONAL CHARACTER VARYING, para utilizar el conjunto de caracteres nacional de la implementación en lugar que el conjunto de caracteres de la implementación. Aceptan cualquier cadena arbitraria de bis. Existen dos tipos:
BIT: Se especifica el tamaÒo de la cadena en bits, o un bit por omisión
BIT VARYING: Puede acomodar cadenas de bits de diferentes tamaÒos, especificando una longitud máxima. Se definen cinco tipos que tratan con fechas y tiempos:
DATE: Guarda año, mes y día en una fecha de la forma AAAA-MM-DD.
TIME: Guarda horas, minutos y segundos de determinado tiempo de la forma HH:MM:SS. Los segundos pueden llevar parte fraccionaria de por lo menos 6 dígitos pero depende de la implementación. Se puede especificar el número de posiciones siendo 8 el valor por omisión (el punto decimal de los segundos ocupa la novena posición). TIMESTAMP: Incluye fecha y tiempo. Tiene la misma característica que DATE y TIME, excepto que el valor por omisión para la parte fraccional de los segundos para un TIMESTAMP es de 6 dígitos. Es de la forma:
AAAA-MM-DD HH:MM:SS.TIME WITH TIME ZONE: Igual que TIME pero agrega información de offset con respecto al UT (Universal Time, o también conocido como GMT). Este offset puede ser positivo o negativo. Puede llevar parte fraccionaria. Es de la forma HH:MM:SS+/-HH:MM. TIMESTAMP WITH TIME ZONE: Igual que TIMESTAMP pero con información de offset con respecto al UT. Puede llevar parte fraccionaria. Es de la forma AAAA-MM-DD HH:MM:SS+/-HH:MM. Es muy similar a los tipos de datos de fechas. Un intervalo es la diferencia entre dos valores de fechas o tiempos. Se tiene dos tipos de intervalos:
- año - mes: El número de años y meses entre dos fechas.
- día - tiempo: el número de días, horas, minutos y segundos entre dos fechas de un mismo mes
Un campo que no posee un valor tiene un valor nulo, que no es lo mismo que un valor de cero para un numérico o un espacio para una cadena. Un valor nulo es un valor indefinido.