Introducción a los tipos de datos en SQL
A diferencia de JavaScript, SQL tiene una tipificación fuerte. En cada tabla, cada columna tiene su propio tipo de datos fijo.
Hay muchos tipos de datos, pero a diferencia del lenguaje Java, hay muchos de ellos no porque haya tipos de datos para todas las ocasiones. Las bases de datos dependen mucho del tamaño de los datos, por lo que muchos tipos de datos difieren entre sí solo en la longitud.
En total, los tipos de datos se pueden dividir en 5 grupos:
- Tipos numéricos
- Tipos de cadenas
- Tipos para almacenar fechas y horas
- Objetos: generalmente representados como una colección de bytes
- Transporte : JSON y XML
Por lo general, diferentes DBMS todavía tienen sus propios tipos de datos. Cada DBMS tiene su propia especialización, por lo que agregar nuevos tipos de datos es algo muy común.
Otra cosa es que solo agregar un nuevo tipo de datos no es suficiente, debe agregar funciones que funcionen con él, así como también hacer que esto funcione de manera conveniente y rápida.
Si trabaja en cualquier DBMS industrial (empresarial), lo más probable es que tenga que lidiar con sus tipos de datos y sus funciones. Por que será necesario leer 2-5 libros buenos.
Como parte de nuestra familiaridad con SQL, consideraremos tres grupos principales de tipos de datos:
- Números
- Instrumentos de cuerda
- fechas
Tipos numéricos en SQL
En SQL, los tipos numéricos se dividen en tres grupos:
- tipos enteros
- Números de punto fijo (número fijo de lugares decimales)
- Números de punto flotante
Comencemos con los números enteros . Solo hay 5 de ellos, y se pueden describir en una tabla:
# | Escribe un nombre | Longitud en bytes | Analógico de Java | Valor mínimo | Valor máximo |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | SMALLINT | 2 | short | -32.768 | 32.767 |
3 | MEDIUMINT | 3 | -8,388,608 | 8,388,607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | BIGINT | 8 | long | -2 63 | 2 63-1 |
Los tipos de datos son muy similares a los tipos de datos de Java, pero también hay un tipo entero que tiene una longitud de tres bytes. Esto se hace para ahorrar en tamaño.
Luego vienen los tipos de punto flotante , al igual que en Java, solo hay dos de ellos:
# | Escribe un nombre | Longitud en bytes | Analógico de Java | Valor mínimo | Valor máximo |
---|---|---|---|---|---|
1 | FLOAT | 4 | float | -3.40E+38 | +1.18E+38 |
2 | DOUBLE | 8 | double | -1.79E+308 | +1.79E+308 |
De nuevo, nada nuevo. Todo es igual que en Java. Sin embargo, a diferencia de Java, SQL tiene otro tipo especial, el número real de punto fijo. Se llama DECIMAL.
Por lo general, este tipo se utiliza para almacenar cantidades de dinero. Cuando se escribe el nombre de este tipo, luego se suele indicar cuántos lugares decimales tiene el número antes y después del punto decimal. El formato general se ve así:
DECIMAL(total_characters, after_comma)
Y un pequeño ejemplo:
salary DECIMAL(5,2)
Así es como describimos el hecho de que la columna de salario puede contener números enteros (máximo 3 decimales) y una parte fraccionaria - 2 decimales.
El número máximo de caracteres que admite el tipo DECIMAL es 65.
Tipos de cadenas en SQL
Las filas de una base de datos se pueden almacenar de dos formas:
- Cadenas de longitud fija
- Cadenas con longitud variable
Las cadenas de longitud fija se especifican como CHAR :
CHAR(length)
Longitud fija significa que todos los valores de esta columna contendrán un número estrictamente fijo de caracteres.
Un ejemplo de una cadena de longitud fija:
country_code CHAR(2)
Las cadenas de longitud variable se especifican mediante el tipo VARCHAR :
VARCHAR(max_length)
Longitud variable significa que todos los valores de esta columna contendrán texto de cualquier longitud, pero no más que la longitud máxima.
Ejemplo de cadena de longitud variable:
phone VARCHAR(12)
Las cadenas de longitud fija tienen una gran ventaja. Si el cliente le pidió al servidor SQL que le devolviera la fila número 1,000,000 de la tabla, y las filas de la tabla tienen una longitud fija, entonces, conociendo la longitud de la fila, puede calcular fácilmente los bytes que se relacionan con el deseado fila.
En el caso de una longitud variable de líneas, no será posible encontrar rápidamente la fila deseada en la tabla. Recuerde la velocidad de acceso a ArrayList y LinkedList, la situación es aproximadamente la misma aquí.
Comparemos cómo se almacenarán cadenas de diferentes longitudes en una tabla, según el tipo de datos.
Línea | CARÁCTER(4) | Byte a almacenar | VARCHAR(4) | Byte a almacenar | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'a B C D' | 'a B C D' | 4 | 'a B C D' | 5 | |
'abcdefgh' | 'a B C D' | 4 | 'a B C D' | 5 |
Nota. El tipo VARCHAR requiere un byte más para la misma longitud, porque además tiene que almacenar la longitud de la cadena.
Tipos temporales en SQL
SQL también tiene tipos especiales para almacenar fechas y horas. Hay cinco tipos en total:
# | Escribe un nombre | Analógico de Java DateTime API | Ejemplo | Valor mínimo | Valor máximo |
---|---|---|---|---|---|
1 | DATE | LocalDate | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | TIME | LocalTime | 'hh:mm:ss[.fracción]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATETIME | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | TIMESTAMP | Date | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | YEAR | 1901 | 2155 |
Todos los datos de las consultas se escriben como una cadena, entre comillas simples. El formato de entrada va de mayor a menor:
- Año
- Mes
- Día
- Hora
- Minuto
- Segundo
- fracciones de segundo
Los tipos DATE, TIME y DATETIME pueden considerarse convencionalmente análogos a los tipos de la API Java DateTme: LocalDate, LocalTime, LocalDateTime. La lógica es más o menos la misma.
El tipo TIMESTAMP almacena datos en milisegundos desde principios de 1970 (un estándar del sistema operativo UNIX). Es de esta forma que se almacenan por el tipo Fecha en el lenguaje Java.
Y por último, está el tipo YEAR, que tiene 1 byte de longitud y almacena valores del 1 al 255. Por lo tanto, el rango de años del que dispone es 1901-2155. Este tipo no puede almacenar el año 1900, ya que el valor 0 se usa para codificar un valor NULL.
Almacenar objetos en SQL
Existen tipos especiales para almacenar objetos o textos de gran extensión. No entraremos en detalles sobre ellos, pero los enumeraré de todos modos:
# | Escribe un nombre | Explicación |
---|---|---|
1 | TEXT | Se utiliza para almacenar textos largos. Al comparar y ordenar en este campo, solo se utilizan los primeros 100 caracteres. |
2 | BLOB | El nombre significa Byte Large Object. Almacenado como una colección de bytes. Se puede utilizar para, por ejemplo, almacenar imágenes en una base de datos. |
3 | CLOB | El nombre significa Char Large Object. Se utiliza para almacenar textos largos. |
4 | ENUM | Le permite establecer un conjunto fijo de valores y almacenar uno de ellos como valor. |
5 | SET | Le permite establecer un conjunto fijo de valores y almacenar cualquier subconjunto de ellos como un valor. Por lo general, los almacena como una máscara binaria. |
En teoría, puede serializar cualquier objeto Java como un conjunto de bytes y almacenarlo en la base de datos como un BLOB. Guardar el objeto no es un problema. ¿Cómo trabajar más con él?
Digamos que una tabla almacena un millón de objetos en forma serializada, ¿cómo los buscará? Un DBMS solo admite cierto tipo de datos cuando proporciona un amplio conjunto de funciones para trabajar con ellos.