【⑬MySQL | Tipo de datos (1)】Introducción | Entero | Punto flotante | Punto fijo | Tipo de hora/fecha

prefacio

✨Bienvenido a la columna MySQL de Xiao K , esta sección le brindará una introducción a los tipos de datos MySQL | entero | punto flotante | punto fijo | uso compartido de tipos de hora/fecha✨


inserte la descripción de la imagen aquí

0. Introducción a los tipos de datos

El tipo de datos (tipo_datos) se refiere al tipo de datos permitidos en el sistema. Los tipos de datos MySQL definen las reglas sobre qué datos se pueden almacenar en una columna y cómo se almacenan esos datos.

Cada columna de una base de datos debe tener un tipo de datos apropiado que restrinja o permita los datos almacenados en esa columna. Por ejemplo, si la columna almacena números, el tipo de datos correspondiente debe ser un tipo numérico.

Si utiliza el tipo de datos incorrecto, puede afectar gravemente la función y el rendimiento de la aplicación, por lo que al diseñar la tabla, debe prestar especial atención al tipo de datos utilizado por la columna de datos. Cambiar una columna que contiene datos no es trivial y hacerlo puede provocar la pérdida de datos. Por lo tanto, debe establecer el tipo de datos y la longitud correctos para cada columna al crear la tabla.

Los tipos de datos de MySQL se pueden dividir aproximadamente en cinco tipos, a saber, tipo entero , tipo de número de punto flotante y tipo de número de punto fijo , tipo de fecha y hora , tipo de cadena , tipo binario , etc.

Nota: Los tipos de números enteros y los tipos de punto flotante pueden denominarse colectivamente tipos de datos numéricos.

1 tipo entero

1.1 Introducción de tipo

Los tipos de números enteros incluyen TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT

tipo ilustrar tamaño (bytes)
PEQUEÑO entero muy pequeño 1
PEQUEÑO entero pequeño 2
MEDIO entero de tamaño mediano 3
INT/ENTERO entero de tamaño normal 4
EMPEZANDO entero grande 8

1.2 Atributos opcionales

1.2.1 millones

M : Indica el ancho de visualización y el rango de valores de M es (0,255). Por ejemplo, INT(5): cuando los datos tienen menos de 5 bits, se pueden completar caracteres para completar el ancho requerido. Esta función debe configurarse y ZEROFILLusarse, lo que indica que el ancho se completa con 0; de lo contrario, el ancho de visualización especificado no es válido.

Nota: Establecer el ancho no tendrá ningún efecto en los datos originales ni en los datos insertados, solo el efecto de visualización es diferente. A partir de MySQL 8.0.17, el atributo de ancho de visualización está obsoleto para los tipos de números enteros.

1.2.2 SIN FIRMAR

Todos los tipos de enteros tienen un atributo opcional SIN FIRMAR y el valor mínimo de los tipos de enteros sin signo es 0. Por lo tanto, si necesita guardar números enteros no negativos en MySQL, puede configurar el tipo de entero en tipo sin signo.

1.3 Escenarios de uso

TINYINT: generalmente se usa para tipos de enumeración, como escenarios donde el rango de valores de la configuración del sistema es pequeño y fijo.

SMALLINT: Se puede utilizar para una gama más pequeña de datos estadísticos, como contar el número de inventarios de activos fijos en las fábricas.

MEDIUMINT: Se utiliza para el cálculo de números enteros mayores, como por ejemplo el flujo diario de pasajeros de la estación.

INT, INTEGER: El rango de valores es lo suficientemente grande, en general no es necesario considerar el problema de exceder el límite, son los más utilizados, como los números de producto.

BIGINT: Sólo se utiliza cuando se trata de números enteros particularmente grandes, como el volumen de operaciones de Double Eleven, el número de clics en los sitios web de grandes portales, las posiciones de productos derivados de compañías de valores, etc.

1.4 Cómo elegir

Al evaluar qué tipo de entero usar, debe considerar 存储空间el 可靠性problema del equilibrio: por un lado, usar un tipo de entero que ocupe menos bytes puede ahorrar espacio de almacenamiento; por otro lado, si para ahorrar espacio de almacenamiento, el tipo de entero Se utiliza si el rango de valores es demasiado pequeño, una vez que se encuentra una situación más allá del rango de valores, puede causar 系统错误daños y afectar la confiabilidad.

Por ejemplo, el tipo de datos utilizado por el número de producto es INT. La razón es que hay muchos tipos de productos en circulación en la tienda del cliente, y todos los días, se retiran productos viejos de los estantes y se colocan nuevos productos en los estantes, de manera iterativa y acumulativa.

Si se utiliza el tipo SMALLINT, aunque el número de bytes ocupados es menor que el del certificado de tipo INT, no hay garantía de que los datos no superen los 655345. Por el contrario, el uso de INT puede garantizar que exista un rango de valores lo suficientemente grande y no haya necesidad de preocuparse de que los datos excedan el rango y afecten la confiabilidad.

A lo que debes prestar atención es a que en el trabajo real 系统故障产生的成本远远超过增加几个字段存储空间所产生的成本. Por lo tanto, le sugiero que primero se asegure de que los datos no excedan el rango de valores y luego considere cómo ahorrar espacio de almacenamiento bajo esta premisa.

2 tipos de punto flotante

2.1 Introducción de tipo

Los tipos de coma flotante incluyen FLOAT, DOUBLE y REAL.

tipo ilustrar tamaño (bytes)
FLOTAR punto flotante de precisión simple 4
DOBLE coma flotante de doble precisión 8
REAL El valor predeterminado es DOBLE Establezca el modo SQL en " REAL_AS_FLOAT", REAL es FLOAT
SET sql_mode = "REAL_AS_FLOAT"

2.2 Descripción de la precisión

  • MySQL permite el uso 非标准语法(es posible que otras bases de datos no lo admitan, por lo que si implica reenvío de datos, es mejor no usarlo): FLOAT(M,D) o DOUBLE(M,D). Entre ellos, Mse llama precisión, que significa el número total de dígitos; Dse llama escala, que significa el número de decimales. D<=M<=255, 0<=D<=30.

    Por ejemplo: una columna definida como FLOAT(5,2) se puede mostrar como [-999.99, 999.99] y se informará un error si excede este rango.

  • Cuando no se especifica la precisión de FLOAT y DOUBLE, se utilizará la precisión real de forma predeterminada (determinada por el hardware de la computadora y el sistema operativo).

  • Nota: También se pueden agregar tipos de coma flotante UNSIGNED, pero el rango de datos no se cambiará. Por ejemplo: FLOAT(3,2) UNSIGNED solo puede representar el rango de 0-9,99.

  • Independientemente de si se muestra o no la precisión (M,D), MySQL tiene su propio esquema de procesamiento:

    • Si la parte entera excede el rango al almacenar, se informará un error directamente.
    • Si el punto decimal está fuera de rango al almacenar, analicemos la situación:
      • Si la parte entera no excede el rango después del redondeo, se puede almacenar. Si inserta 999.009 en la columna FLOAT(5,2), el resultado aproximado es 999.01.
      • Si la parte entera excede el rango después del redondeo, se informará directamente un error. Si inserta 999.995 y -999.995 en la columna FLOAT(5,2), se informará un error.
  • A partir de MySQL8.0.17, el uso de FLOAT(M,D) y DOUBLE(M,D) ha quedado claramente obsoleto en el documento oficial y puede eliminarse en el futuro; además, UNSIGNED sobre los tipos de punto flotante FLOAT y DOUBLE tampoco se recomienda y puede eliminarse en el futuro.

La ventaja de los números de punto flotante sobre los números de punto fijo es que los números de punto flotante pueden representar un rango mayor cuando la longitud es fija; la desventaja es que causará problemas de precisión.

Finalmente, me gustaría enfatizar nuevamente: en MySQL, los números de punto fijo se almacenan en forma de cadenas. Cuando los requisitos de precisión son relativamente altos (como moneda y datos científicos), es mejor usar el tipo DECIMAL, y los otros dos números de punto flotante se usan para operaciones de resta y comparación. También es propenso a tener problemas, por lo que debe prestar atención al usar números de punto flotante y tratar de evitar hacer comparaciones de punto flotante.

3 tipos de punto fijo

El tipo de número de coma fija es DECIMAL.

tipo ilustrar tamaño (bytes)
DECIMAL/DEC Números de punto fijo "estrictos" comprimidos M+2

DECIMALES(M,D). Entre ellos, Mse llama precisión, que significa el número total de dígitos; Dse llama escala, que significa el número de decimales. 0<=M<=65, 0<=D<=30, D<M. Por ejemplo, si se define como DECIMAL(5,2), significa que el rango de valores de esta columna es [-999,99, 999,99].

  • El rango máximo de DECIMAL(M,D) es el mismo que el del tipo DOUELE, pero la orientación efectiva de los datos está determinada por M y D. El espacio de almacenamiento de DECIMAL no es fijo, está determinado por la precisión M y el espacio de almacenamiento total ocupado es M+2 bytes. Es decir, en algunos escenarios que no requieren alta precisión, el rango numérico expresado por números de punto flotante puede ser mayor que el de los números de punto fijo que ocupan la misma longitud de bytes.
  • Los números de punto fijo se almacenan en forma de cadenas dentro de MySQL, lo que determina que deben ser precisos.
  • Cuando el tipo DECIMAL no especifica la precisión y la escala, el valor predeterminado es DECIMAL (10,0). Cuando la precisión de los datos excede el rango de precisión del número de punto fijo, MySQL también realizará el redondeo.
  • Punto flotante vs punto fijo
    • En comparación con los números de punto fijo, la ventaja de los números de punto flotante es que cuando la longitud es fija, el tipo de punto flotante tiene un amplio rango de valores, pero no es preciso, adecuado para escenarios de computación científica que requieren un Amplia gama de valores y puede tolerar errores.
    • El rango de valores del tipo de número de punto fijo es relativamente pequeño, pero es preciso y no tiene errores. Está configurado para escenarios que requieren una precisión extremadamente alta (como escenarios para diseñar cálculos de cantidades).

4 tipos de fecha/hora

Incluye AÑO, HORA, FECHA, FECHA HORA y MARCA DE TIEMPO.

tipo ilustrar rango de fechas tamaño (bytes)
AÑO AAAA 1901~2155 1
TIEMPO HH:MM:SS -838:59:59 ~ 838:59:59 3
FECHA AAAA-MM-DD 1000-01-01 ~ 9999-12-3 3
FECHA Y HORA AAAA-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8
MARCA DE TIEMPO AAAA-MM-DD HH:MM:SS 1970-01-01 00:00:00 UTC ~ 2038-01-19 03:14:07 UTC 4

tipo de AÑO

El tipo AÑO es un tipo de un solo byte que se utiliza para representar el año y solo requiere 1 byte para su almacenamiento. El AÑO se puede especificar utilizando varios formatos, como se muestra a continuación:

  • El AÑO se expresa en formato de cadena de 4 dígitos o de número de 4 dígitos y el rango es '1901'~'2155'. El formato de entrada es 'AAAA' o AAAA, por ejemplo, si ingresa '2010' o 2010, el valor insertado en la base de datos es 2010.
  • AÑO en formato de cadena de 2 dígitos, en el rango '00' a '99'. Los valores en el rango '00'~'69' y '70'~'99' se convierten a valores de AÑO en el rango 2000~2069 y 1970~1999, respectivamente. '0' tiene el mismo efecto que '00'. Los valores insertados fuera del rango de valores se convertirán a 2000.

A partir de MySQL5.5.27, no se recomienda el AÑO de 2 dígitos. El formato predeterminado de AÑO es "AAAA", no es necesario escribir AÑO (4).

CREATE TABLE test_year
(
	f1 YEAR,
    f2 YEAR(4)
);

INSERT INTO test_year(f1) VALUES('2021'),(2022);
INSERT INTO test_year(f1) VALUES('2155');
-- out of range value for column 'f1' at row 1
INSERT INTO test_year(f1) VALUES('2156');
INSERT INTO test_year(f1) VALUES('69'),('70');	#2069 1970
INSERT INTO test_year(f1) VALUES(0),('0');

tipo de FECHA

El tipo DATE se utiliza cuando solo se requiere un valor de fecha, sin una parte de tiempo, y requiere 3 bytes para almacenamiento. El formato de fecha es 'AAAA-MM-DD', donde AAAA es el año, MM es el mes y DD es el día.

Al asignar un valor a un campo de tipo FECHA, puede insertar datos de tipo cadena o número, siempre que se ajusten al formato de fecha de FECHA. Como sigue:

  • La fecha expresada en el formato de caracteres 'AAAA-MM-DD' o 'AAAAMMDD', el rango de valores es '1000-01-01'~'9999-12-3'. Por ejemplo, si ingresa '2015-12-31' o '20151231', la fecha insertada en la base de datos será 2015-12-31.
  • Exprese la fecha en el formato de cadena 'AA-MM-DD' o 'AAMMDD', donde AA representa el valor del año de dos dígitos. MySQL interpreta las reglas para el valor del año de dos dígitos: el valor del año en el rango de '00~69' se convierte a '2000~2069', y el valor del año en el rango de '70~99' se convierte a ' 1970~1999'. Por ejemplo, si ingresa '15-12-31', la fecha insertada en la base de datos es 2015-12-31; si ingresa '991231', la fecha insertada en la base de datos es 1999-12-31.
  • Utilice CURRENT_DATE() o NOW() para insertar la fecha actual del sistema.

Consejo: MySQL permite una sintaxis "laxa": cualquier signo de puntuación se puede utilizar como espaciador entre las partes de la fecha. Por ejemplo, '98-11-31', '98.11.31', '98/11/31' y '98@11@31' son equivalentes y estos valores también se insertarán correctamente en la base de datos.

CREATE TABLE test_date1
(
	f1 DATE
);

INSERT INTO test_date1 VALUES('2022-04-16'),('20220416'),(20220416);
INSERT INTO test_date1 VALUES('22-04-16'),('220416'),
						     ('69-04-16'),('690416'),
						     ('70-04-16'),('700416'),
						     ('99-04-16'),('990416');
INSERT INTO test_date1 VALUES(220416),(690416),(700416),(990416);
INSERT INTO test_date1 VALUES(CURRENT_DATE()),(NOW());

tipo de TIEMPO

El tipo TIME se utiliza para valores que solo requieren información de tiempo y requiere 3 bytes para su almacenamiento. El formato es HH:MM:SS. HH indica horas, MM indica minutos y SS indica segundos.

El rango de valores del tipo TIME es -838:59:59 ~ 838:59:59. La razón por la cual la parte de hora es tan grande es que el tipo TIME no solo se puede usar para representar la hora del día (debe ser menor superior a 24 horas), pero también un evento Tiempo transcurrido o intervalo de tiempo entre dos eventos (puede ser superior a 24 horas, o incluso negativo).

El valor de HORA se puede especificar en varios formatos, como se indica a continuación.

  • Cadena en formato 'D HH:MM:SS'. También se pueden utilizar estas sintaxis "no estrictas": 'HH:MM:SS', 'HH:MM', 'D HH' o 'SS'. Aquí D representa el día y puede tomar un valor entre 0 y 34. Al insertar en la base de datos, D se convierte a horas y se guarda en el formato "D*24+HH".
  • Formato 'HHMMSS', una cadena sin interrupciones o un valor en formato HHMMSS, que se supone que es una hora significativa. Por ejemplo, '101112' se entiende como '10:11:12', pero '106112' es ilegal (tiene una parte de minutos sin sentido) y se convierte en 00:00:00 cuando se almacena.
  • Utilice CURRENT_TIME() o NOW() para insertar la hora actual del sistema.

Consejo: tenga cuidado al asignar valores abreviados a las columnas de TIEMPO: sin los dos puntos, MySQL interpreta el valor asumiendo que los dos dígitos más a la derecha representan segundos . (MySQL interpreta los valores de TIME como tiempos pasados ​​en lugar de tiempos actuales). Por ejemplo, un lector puede pensar que '1112' y 1112 significan 11:12:00 (es decir, 12 minutos después de las 11 en punto), pero MySQL los interpreta como 00:11:12 (es decir, 11 minutos y 12 segundos). Asimismo, '12' y 12 se interpretan como 00:00:12. Por el contrario, los dos puntos en un valor de HORA deben interpretarse como la hora del día, es decir, '11:12' significa 11:12:00, no 00:11:12.

CREATE TABLE test_time1
(
	f1 TIME
);
INSERT INTO test_time1 
VALUES('10:35:30'),('2 10:35:30'),('10:35'),('2 10:35'),('1 35'),('30');
INSERT INTO test_time1 VALUES('103530'),(103530),(1035);
INSERT INTO test_time1 VALUES(NOW()),(CURRENT_TIME());

tipo FECHA HORA

El tipo DATETIME se utiliza para valores que deben contener información de fecha y hora y requiere 8 bytes para su almacenamiento. El formato de fecha es 'AAAA-MM-DD HH:MM:SS', donde AAAA es el año, MM es el mes, DD es el día, HH es la hora, MM es el minuto y SS es el segundo.

Al asignar un valor a un campo de tipo DATETIME, puede insertar datos de tipo cadena o número, siempre que se ajusten al formato de fecha de DATETIME, como se muestra a continuación.

  • La fecha expresada en el formato de cadena 'AAAA-MM-DD HH:MM:SS' o 'AAAAMMDDHHMMSS', el rango de valores es '1000-01-01 00:00:00'~'9999-12-3 23: 59: 59'.
  • Una fecha en el formato de cadena 'AA-MM-DD HH:MM:SS' o 'AAMMDDHHMMSS', donde AA representa el valor del año de dos dígitos. Como antes, los valores de año en el rango '00~79' se convierten a '2000~2079', y los valores de año en el rango '80~99' se convierten a '1980~1999'.
  • Fecha y hora en formato numérico AAAAMMDDHHMMSS o AAAAMMDDHHMMSS.

Consejo: **MySQL permite una sintaxis "laxa": cualquier carácter de puntuación se puede utilizar como espaciador entre partes de fecha o partes de hora. **Por ejemplo, '98-12-31 11:30:45', '98.12.31 11+30+35', '98/12/31 11 30 45' y '98@12@31 11^30^ 45' son equivalentes, y los valores se insertan correctamente en la base de datos.

CREATE TABLE test_datetime1
(
	dt DATETIME
);
INSERT INTO test_datetime1 VALUES('2022-04-16 18:50:30'),('20220416185030');
INSERT INTO test_datetime1 VALUES('99-04-16 18:50:30'),('990416185030'),
								 ('22-04-16 18:50:30'),('220416185030');
INSERT INTO test_datetime1 VALUES(20220202000000);
INSERT INTO test_datetime1 VALUES(CURRENT_TIMESTAMP()),(NOW());

Tipo de marca de tiempo

El formato de visualización de TIMESTAMP es el mismo que el de DATETIME, el ancho de visualización se fija en 19 caracteres, el formato de fecha es AAAA-MM-DD HH:MM:SS y se requieren 4 bytes para el almacenamiento. Pero el rango de valores de la columna TIMESTAMP es menor que el de DATETIME, que es '1970-01-01 00:00:01' UTC~'2038-01-19 03:14:07' UTC. Al insertar datos, asegúrese de que estén dentro del rango de valores legales.

Consejo: La hora universal coordinada (inglés: hora universal coordinada, francés: Temps Universel Coordonné) también se conoce como hora universal unificada, hora universal estándar y hora internacional coordinada. Las abreviaturas en inglés (CUT) y francés (TUC) son diferentes y, a modo de compromiso, se denomina UTC.

Además de los diferentes bytes de almacenamiento y los rangos admitidos entre TIMESTAMP y DATETIME, existe otra diferencia importante:

  • Cuando DATETIME almacena datos de fecha, se almacena de acuerdo con el formato de entrada real, es decir, almacena todo lo que se ingresa, independientemente de la zona horaria;
  • El valor TIMESTAMP se almacena en formato UTC (hora universal coordinada), la zona horaria actual se convierte cuando se almacena y se vuelve a convertir a la zona horaria actual cuando se recupera. Es decir, al realizar la consulta, el valor de hora mostrado es diferente según la zona horaria actual.

Consejo: Si asigna un valor de FECHA a un objeto DATETIME o TIMESTAMP, la parte de tiempo del valor resultante se establece en '00:00:00', por lo que el valor de FECHA no contiene información de tiempo. Si a un objeto DATE se le asigna un valor DATETIME o TIMESTAMP, la porción de tiempo del valor resultante se elimina, por lo que el valor DATE no contiene información de tiempo.

CREATE TABLE test_timestamp
(
	ts TIMESTAMP
);
INSERT INTO test_timestamp VALUES('1999-01-01 01:02:03'),('1999-01-01 01:02:03'),
								 ('99-01-01 01:02:03'),('990101010203');
INSERT INTO test_timestamp VALUES('2022@01@02@11@22@33');
INSERT INTO test_timestamp VALUES(CURRENT_TIMESTAMP()),(NOW());

Diferencia entre MARCA DE TIEMPO y FECHA HORA

CREATE TABLE temp_time
(
	d1 DATETIME,
    d2 TIMESTAMP
);
INSERT INTO temp_time VALUES('2022-04-16 19:09:55','2022-04-16 19:09:55');
INSERT INTO temp_time VALUES(NOW(),NOW());

SELECT * FROM temp_time;

SET time_zone = '+9:00'

SELECT * FROM temp_time;	#设置之后再查询一次
  • establecer zona horaria
SET time_zone = '+9:00'

inserte la descripción de la imagen aquí

La magia de TIMESTAMP

Las marcas de tiempo TIMESTAMP pueden tener múltiples características diferentes cuando se crean, como por ejemplo:

1. Actualice esta columna de datos al crear nuevos registros y modificar registros existentes:

TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

2. Establezca este campo en la hora actual al crear un nuevo registro, pero no lo actualice cuando se modifique más tarde:

TIMESTAMP DEFAULT CURRENT_TIMESTAMP

3. Establezca este campo en 0 al crear un nuevo registro y actualícelo cuando se modifique más adelante:

TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

4. Establezca este campo en un valor determinado al crear un nuevo registro y actualícelo cuando se modifique más adelante:

TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss' ON UPDATE CURRENT_TIMESTAMP

Simular inicio de sesión de usuario

CREATE TABLE t_user
(
	id INT PRIMARY KEY AUTO_INCREMENT,
	createtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	lastlogintime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	is_online TINYINT DEFAULT 0
);
INSERT INTO t_user(is_online) VALUES(1);

SELECT * FROM t_user;

# 数据更新
UPDATE t_user SET is_online=0 WHERE id=1;

inserte la descripción de la imagen aquí

Originalmente, los dos tiempos son exactamente iguales, pero cuando el usuario se desconecta, lastlohintimese produce una actualización automática.

Resumir

En general, elegir un tipo de datos apropiado puede mejorar el rendimiento de la base de datos, ahorrar espacio de almacenamiento, garantizar la coherencia y validez de los datos y facilitar el procesamiento y el cálculo de los datos. Por lo tanto, al diseñar una base de datos, es muy importante elegir el tipo de datos adecuado. ~La siguiente sección trae el intercambio de cadenas | tipos binarios.

Supongo que te gusta

Origin blog.csdn.net/qq_72157449/article/details/132395966
Recomendado
Clasificación