sql >> Base de Datos >  >> RDS >> Mysql

Una introducción a los tipos de datos de MySQL


Introducción

Una de las características principales de las bases de datos relacionales en general es la capacidad de definir esquemas o estructuras de tablas que especifican exactamente el formato de los datos que contendrán. Esto se hace prescribiendo las columnas que contienen estas estructuras junto con su tipo de datos y cualquier restricción.

Los tipos de datos especifican un patrón general para los datos que aceptan y almacenan. Los valores deben cumplir con los requisitos que describen para ser aceptados por MySQL. Si bien es posible definir requisitos personalizados, los tipos de datos proporcionan los componentes básicos que permiten a MySQL validar la entrada y trabajar con los datos mediante las operaciones adecuadas.

MySQL incluye una amplia gama de tipos de datos que se utilizan para etiquetar y validar que los valores se ajusten a los tipos apropiados. En esta guía, analizaremos los tipos de datos más comunes disponibles en MySQL, los diferentes formatos de entrada y salida que utilizan y cómo configurar varios campos para satisfacer las necesidades de sus aplicaciones.


¿Cuáles son los tipos de datos en MySQL?

Antes de entrar en detalles, echemos un vistazo general a los tipos de datos que ofrece MySQL.

MySQL admite una gama razonable de tipos de datos adecuados para varios tipos de datos simples y complejos. Estos incluyen:

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT
  • DECIMAL
  • NUMERIC
  • FLOAT
  • DOUBLE
  • BIT
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIME
  • YEAR
  • CHAR
  • VARCHAR
  • BINARY
  • VARBINARY
  • BLOB
  • TEXT
  • ENUM
  • SET
  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON
  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION
  • JSON

Cubriremos los más comunes con más profundidad a lo largo de esta guía.



Introducción a los tipos de datos MySQL

A medida que comienza con los tipos, es importante recordar que los tipos por sí solos no siempre son una solución completa para la validación de datos, sino un componente. Otras herramientas de bases de datos, como las restricciones, también juegan un papel en la definición de la corrección. Aun así, los tipos de datos suelen ser la primera línea de defensa contra los datos no válidos.

En muchos casos, los tipos generales proporcionados por MySQL son apropiados para los tipos de datos que almacenará. Por ejemplo, si bien puede almacenar las coordenadas de un punto geométrico en dos columnas de números diferentes, el point proporcionado type está diseñado específicamente para almacenar y validar exactamente este tipo de información. Al elegir tipos, verifique que esté usando el tipo más específico aplicable a su caso de uso.




Números y valores numéricos

MySQL incluye una gama de tipos de datos numéricos adecuados para diferentes escenarios. El tipo apropiado depende de la naturaleza exacta de los valores que planea almacenar, así como de sus requisitos de precisión.


Enteros

El entero El tipo de datos es una categoría de tipos utilizados para almacenar números sin fracciones ni decimales. Estos pueden ser valores positivos o negativos, y diferentes tipos de enteros pueden almacenar diferentes rangos de números. Los tipos enteros con rangos más pequeños de valores aceptables ocupan menos espacio que aquellos con rangos más amplios.

La lista básica de tipos de enteros incluye lo siguiente:

Tipo entero Longitud Rango de signo aplicable Rango sin firmar aplicable
TINYINT 1 byte -128 a 127 0 a 255
SMALLINT 2 bytes -32768 a 32767 0 a 65535
MEDIUMINT 3 bytes -8388608 a 8388607 0 a 16777215
INT 4 bytes -2147483648 a 2147483647 0 a 4294967295
BIGINT 8 bytes -2^63 a -2^63-1 0 a 2^64-1

Los tipos anteriores están limitados por su rango válido. Cualquier valor fuera del rango generará un error.

Además de los tipos mencionados anteriormente, MySQL también reconoce un alias llamado SERIAL . Marcar una columna como SERIAL le dará estas propiedades:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE . Se utiliza como abreviatura de las propiedades comunes de la columna de clave principal. La columna asignará automáticamente un nuevo valor único cada vez que se agregue un registro.



Punto fijo

Los tipos de punto fijo se utilizan para controlar la cantidad de precisión o especificidad posible para un número con decimales. En MySQL, esto se puede controlar manipulando dos factores:precisión y escala.

Precisión es la cantidad máxima de dígitos totales que puede tener un número. Por el contrario, escala es el número de dígitos a la derecha del punto decimal. Al manipular estos números, puede controlar qué tan grandes pueden ser los componentes fraccionarios y no fraccionarios de un número.

Estos dos argumentos se usan para controlar la precisión arbitraria usando el numeric o decimal tipos de datos (estos dos tipos son sinónimos en MySQL). El numeric type toma de cero a dos argumentos.

Sin argumentos, la columna se define con una precisión de 10 y una escala de 0. Esto significa que la columna puede contener hasta 10 dígitos, pero ninguno de estos puede estar después del punto decimal:

NUMERIC

Cuando se proporciona un solo argumento, se interpreta como la precisión de la columna con la escala establecida en 0. Esto le permite especificar el número máximo de dígitos en un número entero (sin componentes fraccionarios o decimales). Por ejemplo, si necesita un número entero de 5 dígitos, puede especificar:

NUMERIC(5)

Especifique la precisión seguida de la escala al configurar una columna con ambos controles. MySQL redondeará el componente decimal de cualquier entrada al número correcto de dígitos usando el número de escala. MySQL utilizará la precisión y la escala para determinar cuántos dígitos se permiten en el lado izquierdo del punto decimal. Si una entrada excede el número permitido de dígitos, MySQL generará un error.

Por ejemplo, podemos especificar una columna con una precisión total de 5 y una escala de 2:

NUMERIC(5, 2)

Esta columna tendría el siguiente comportamiento:

Valor de entrada Valor redondeado ¿Aceptado (se ajusta a la precisión)?
400.28080 400,28
8.332799 8.33
11799.799 11799.80 No
11799 11799 No
2802.27 2802.27 No


Coma flotante

Los números de coma flotante son otra forma de expresar números decimales, pero sin una precisión exacta y constante. En cambio, los tipos de punto flotante solo tienen un concepto de máxima precisión que a menudo está relacionado con la arquitectura y la plataforma del hardware.

Por ejemplo, para limitar una columna de coma flotante a 8 dígitos de precisión, puede usar FLOAT type, que almacena los resultados usando 4 bytes con entre 0 y 23 dígitos de precisión:

FLOAT(8)

Del mismo modo, el DOUBLE type usa 8 bytes para almacenar datos y puede usar precisiones de 24 a 53 dígitos.

Debido a estas opciones de diseño, los números de coma flotante pueden funcionar con números con una gran cantidad de decimales de manera eficiente, pero no siempre exactamente. La representación interna de los números puede causar ligeras diferencias entre la entrada y la salida. Esto puede causar un comportamiento inesperado al comparar valores, hacer cálculos de punto flotante o realizar operaciones que requieren valores exactos.



Punto flotante vs numérico

Ambos números de punto flotante proporcionados por tipos como FLOAT y DOUBLE y números de punto fijo proporcionados por NUMERIC o DECIMAL Los tipos se pueden utilizar para almacenar valores decimales. ¿Cómo sabes cuál usar?

La regla general es que si necesita exactitud en sus cálculos, el NUMERIC tipo es siempre la mejor opción. El NUMERIC type almacenará los valores exactamente como se proporcionan, lo que significa que los resultados son completamente predecibles al recuperar o calcular valores. El NUMERIC tipo se llama precisión arbitraria porque especifica la cantidad de precisión que requiere el tipo y almacenará esa cantidad exacta de dígitos en el campo.

Por el contrario, tipos como FLOAT y DOUBLE son tipos de precisión variable. La cantidad de precisión que mantienen depende del valor de entrada. Cuando alcanzan el final de su nivel de precisión permitido, pueden redondear los dígitos restantes, lo que genera diferencias entre los valores enviados y recuperados.

Entonces, ¿cuándo usaría tipos de precisión variable? Tipos de precisión variable como FLOAT y DOUBLE son adecuados para escenarios donde los valores exactos no son necesarios (por ejemplo, si se redondearán de todos modos) y cuando la velocidad es muy valiosa. La precisión variable generalmente ofrecerá beneficios de rendimiento sobre el NUMERIC tipo.




Tipos de cadena

Los tipos de caracteres y tipos de cadenas de MySQL se pueden colocar en dos categorías:longitud fija y longitud variable . La elección entre estos dos afecta cómo MySQL asigna espacio para cada valor y cómo valida la entrada.

El tipo de datos basado en caracteres más simple dentro de MySQL es char tipo. Sin argumentos, el char type acepta un solo carácter como entrada:

CHAR

Cuando se proporciona un entero positivo en la declaración, el char la columna almacenará una cadena de caracteres de longitud fija igual al número de caracteres especificado:

CHAR(10)

Si se proporciona una cadena con menos caracteres, se agregarán espacios en blanco para rellenar la longitud:

Entrada # de caracteres de entrada Valor almacenado # de caracteres almacenados
'árbol' 4 'árbol      ' 10

Si se proporciona una cadena con un número de caracteres superior al permitido, MySQL generará un error. Como excepción a esta regla, si los caracteres desbordados son todos espacios, MySQL simplemente truncará los espacios sobrantes para que quepan en el campo.

La alternativa a los campos de caracteres de longitud fija son los campos de longitud variable. Para esto, MySQL proporciona el varchar tipo. El varchar type almacena caracteres sin tamaño fijo. A diferencia de char , varchar no se puede usar sin especificar el número máximo de caracteres para almacenar.

Al definir un varchar con un entero positivo, puede establecer una longitud máxima de cadena:

VARCHAR(10)

Esto difiere de usar el char escriba con un número entero en ese varchar no rellenará el valor si la entrada no cumple con la longitud máxima del campo:

Entrada # de caracteres de entrada Valor almacenado # de caracteres almacenados
'árbol' 4 'árbol' 4

Si la cadena es mayor que la longitud máxima, MySQL arrojará un error. El mismo comportamiento de truncamiento que está presente en char campos ocurre aquí:si los caracteres desbordados son espacios, se truncarán para que quepan dentro de la longitud máxima de caracteres.

MySQL también soporta el binary y varbinary tipos de datos. Estos funcionan de manera similar al char y varchar pero almacena cadenas binarias en lugar de cadenas de caracteres. Esto tiene implicaciones sobre cómo se almacenan y operan (para cosas como comparaciones, clasificación, etc.).

Para binary y varbinary tipos, el número entero dado al definir el tipo de columna representa el número de bytes en lugar del número de caracteres.

Otros dos tipos de datos que ofrece MySQL para cadenas y almacenamiento de caracteres son blob y text . Estos tipos funcionan de manera similar al varchar y varbinary tipos respectivamente y están destinados a almacenar objetos grandes. Funcionan en su mayoría de la misma manera que sus contrapartes, pero tienen algunas diferencias, como que no pueden comenzar a tener valores predeterminados y requieren una longitud de prefijo al crear un índice.



Booleanos

MySQL en realidad no tiene un tipo booleano nativo para representar valores verdaderos y falsos.

MySQL reconoce los tipos BOOL o BOOLEAN en un esfuerzo por la compatibilidad con otros sistemas de bases de datos. Su implementación interna, sin embargo, usa un TINYINT(1) columna para almacenar los valores y los interpreta como verdaderos o falsos según un conjunto de reglas.

Al interpretar valores numéricos en un contexto booleano, el valor de 0 se considera falso. Todos los valores distintos de cero se consideran verdaderos.

MySQL reconoce los literales booleanos TRUE y FALSE y convierte TRUE a 1 y FALSE a 0 al almacenarlos.



Fechas y hora

MySQL admite la representación de fechas, horas y combinaciones de las dos.


Fechas

La date type puede almacenar una fecha sin un valor de tiempo asociado:

DATE

Al procesar la entrada para date columnas, MySQL puede interpretar diferentes formatos para determinar la fecha correcta para almacenar. Sin embargo, las partes componentes siempre deben venir en la misma secuencia:año, mes y luego día. El STR_TO_DATE() La función está disponible para ayudar a convertir otros formatos de fecha a un formato que MySQL interpretará correctamente.

Al mostrar fechas, MySQL usa el YYYY-MM-DD formato. Puede usar el DATE_FORMAT() función para dar formato a la salida en otros formatos.

La date type puede almacenar valores que van desde 1000-01-01 a 9999-12-31 .



Tiempo

El time tipo de datos puede almacenar una hora específica del día sin una zona horaria o fecha asociada.

Al procesar la entrada para time columnas, MySQL puede interpretar múltiples formatos para determinar el tiempo correcto para almacenar. Cuando la entrada tiene dos puntos, generalmente se interpreta como hh:mm:ss . Cualquier valor abreviado (usando solo una columna) se interpretará como usando hh:mm . Cuando la entrada no tiene dos puntos, el tiempo se procesa para llenar primero el valor más pequeño. Por ejemplo, 1045 se toma como 10 minutos y 45 segundos.

MySQL también admite segundos fraccionarios si se proporciona un punto decimal. Almacena hasta 6 dígitos de precisión después del decimal. Valores en time las columnas pueden variar desde -838:59:59.000000 a 838:59:59.000000 .

Al mostrar valores de tiempo, MySQL usa el hh:mm:ss formato. Al igual que con las fechas, se proporciona una función llamada TIME_FORMAT() para mostrar valores de tiempo usando otros formatos.




Timestamps y datetime

MySQL puede representar marcas de tiempo, una combinación de fecha y hora que se usa para representar un momento específico en el tiempo, en dos variaciones diferentes:usando la timestamp tipo y el datetime tipo.

El datetime type puede representar valores desde 1000-01-01 00:00:00 a 9999-12-31 23:59:59 . También puede incluir segundos fraccionarios de hasta seis dígitos similares a la time tipo.

La timestamp type puede representar valores de 1970-01-01 00:00:01 UTC a 2038-01-19 03:14:07 UTC. También puede manejar fracciones de segundo. Al almacenar timestamp valores, todos los valores se convierten de la zona horaria dada a UTC para el almacenamiento y se vuelven a convertir a la zona horaria local al recuperarlos. El datetime tipo no hace esto.

Desde MySQL 8.0.19 en adelante, puede incluir un desplazamiento de zona horaria al almacenar una timestamp para establecer explícitamente la zona horaria para el valor almacenado. Para ello, incluya un valor después del componente de tiempo, sin espacio para indicar el desplazamiento. El rango de valores aceptados va desde -14:00 a +14:00 , que representa el desplazamiento del valor almacenado desde UTC.

Al decidir si almacenar valores de fecha y hora usando datetime o timezone tipos, a menudo es útil separarlos por lo que son mejores.

Piensa en datetime valores como una fecha y hora específicas, en relación con el calendario y el reloj donde sea que se recupere. Si una persona se acuesta a las 11 de la noche, un datetime value puede representar ese valor, independientemente de la zona horaria en la que se encuentre la persona actualmente.

Por otro lado, timezone los valores son mejores para representar un momento específico en el tiempo que no es ambiguo en todas las zonas horarias. Para enviar una invitación a una videollamada, una timezone value podría asegurarse de que la reunión se realice a la misma hora para todos, independientemente de la zona horaria en la que se encuentre el participante.



Otros tipos utiles

Junto con los tipos que cubrimos con cierta profundidad anteriormente, hay tipos adicionales que son útiles en escenarios específicos. Los cubriremos brevemente para darle una idea de cómo usarlos y cuándo pueden ser útiles.


Tipos enumerados y establecidos

Dos tipos relacionados que permiten a los usuarios dictar los valores válidos para una columna son enum y set tipos.

El enum type es un tipo de cadena que permite al usuario definir una colección de valores válidos cuando se crea la columna. Se acepta cualquier valor que coincida con uno de los valores definidos y se rechazan todos los demás valores. Esto funciona de manera similar a un menú desplegable en el que se puede elegir entre un conjunto específico de opciones. Por ejemplo, un enum llamada season podría crearse con los valores winter , spring , summer y autumn .

Para crear un enum columna, especifique el tipo como enum , dando los valores posibles como cadenas, separados por comas, dentro de un conjunto de paréntesis, así:

season ENUM('winter', 'spring', 'summer', 'autumn')

Un tipo similar de tipo definido por el usuario es el set tipo. Como el enum tipo, set Los tipos permiten a los usuarios especificar valores válidos como cadenas tras la definición. La diferencia entre estos dos tipos es que en un set , se puede almacenar más de un valor para cada registro.

Por ejemplo, si necesita una columna para representar los días de la semana en que los voluntarios están disponibles para trabajar, podría tener un set columna como esta:

availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')

Al ingresar valores para la availability columna que acabamos de crear, proporciona una sola cadena con comas que separan todos los días que el voluntario está disponible. Por ejemplo:

'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'

Para set tipos en MySQL, los valores duplicados en la entrada siempre se eliminan y, al recuperarlos, los valores siguen el orden utilizado en el set definición independientemente del orden cuando se ingresa en la columna.



JSON

MySQL admite columnas en JSON utilizando json tipo. Datos almacenados como json se almacena en binario para una ejecución y un procesamiento más rápidos, de modo que el servidor no tenga que interpretar una cadena para operar en JSON valores.

JSON

Para operar en JSON columnas, MySQL proporciona una serie de funciones para trabajar con valores dentro del documento.




Conclusión

En este artículo, hemos cubierto muchos de los tipos de datos más comunes que son útiles cuando se trabaja con bases de datos MySQL. Hay tipos adicionales que no se tratan en esta guía que es útil conocer, pero representan un buen punto de partida para la mayoría de los casos de uso.

Es importante utilizar el sistema de tipos correctamente para que pueda controlar los valores válidos y operar con los datos como se espera. Hay dificultades con las que puede encontrarse si elige un tipo que no es adecuado para sus datos, por lo que, en la mayoría de los casos, vale la pena pensarlo antes de comprometerse con un tipo de datos.

Si está utilizando Prisma Client para trabajar con sus bases de datos MySQL, puede encontrar una asignación entre algunos de los tipos comunes de MySQL y Prisma en los documentos de conectores de datos MySQL de Prisma.