MySQL
Tipos de datos
Buscar..
Fundición implícita / automática
select '123' * 2;
Para hacer la multiplicación con 2
MySQL convierte automáticamente la cadena 123
en un número.
Valor de retorno:
246
La conversión a un número comienza de izquierda a derecha. Si la conversión no es posible el resultado es 0
select '123ABC' * 2
Valor de retorno:
246
select 'ABC123' * 2
Valor de retorno:
0
VARCHAR (255) - o no
Sugerido max len
Primero, mencionaré algunas cadenas comunes que siempre son hexadecimales o, de lo contrario, limitadas a ASCII. Para estos, debe especificar CHARACTER SET ascii
( latin1
está bien) para que no desperdicie espacio:
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
¿Por qué no simplemente 255? Hay dos razones para evitar la práctica común de usar (255) para todo.
- Cuando un
SELECT
complejo necesita crear una tabla temporal (para una subconsulta,UNION
,GROUP BY
, etc.), la opción preferida es usar el motorMEMORY
, que coloca los datos en la RAM. Pero losVARCHARs
se convierten enCHAR
en el proceso. Esto hace queVARCHAR(255) CHARACTER SET utf8mb4
tome 1020 bytes. Eso puede llevar a la necesidad de derramar en el disco, que es más lento. - En ciertas situaciones, InnoDB verá el tamaño potencial de las columnas en una tabla y decidirá que será demasiado grande, abortando una
CREATE TABLE
.
VARCHAR versus TEXTO
Consejos de uso para *TEXT
, CHAR
y VARCHAR
, además de algunas de las mejores prácticas:
- Nunca uses
TINYTEXT
. - Casi nunca se usa
CHAR
- es de longitud fija; cada carácter es la longitud máxima del conjunto deCHARACTER SET
(por ejemplo, 4 bytes / carácter para utf8mb4). - Con
CHAR
, useCHARACTER SET ascii
menos que sepa lo contrario. -
VARCHAR(n)
truncará en n caracteres ;TEXT
se truncará en algún número de bytes . (Pero, ¿quieres truncamiento?) -
*TEXT
puede ralentizar losSELECTs
complejos debido a cómo se manejan las tablas temporales.
INT como AUTO_INCREMENT
Cualquier tamaño de INT
se puede utilizar para AUTO_INCREMENT
. UNSIGNED
siempre es apropiado.
Tenga en cuenta que ciertas operaciones "queman" los AUTO_INCREMENT
. Esto podría llevar a una brecha inesperada. Ejemplos: INSERT IGNORE
y REPLACE
. Pueden asignar previamente una identificación antes de darse cuenta de que no será necesaria. Este es el comportamiento esperado y por diseño en el motor InnoDB y no debe desalentar su uso.
Otros
Ya hay una entrada por separado para "FLOAT, DOUBLE, DECIMAL" y "ENUM". Es probable que una sola página sobre tipos de datos sea difícil de manejar; sugiero que los "tipos de campo" (¿o debería llamarse "tipos de datos"?) Sean una descripción general, luego se dividan en estas páginas de temas:
- INTs
- FLOTACIÓN, DOBLE, Y DECIMAL
- Cuerdas (CHARs, texto, etc.)
- BINARIO y BLOB
- DATETIME, TIMESTAMP, y amigos
- ENUM y SET
- Datos espaciales
- Tipo JSON (MySQL 5.7.8+)
- Cómo representar el dinero y otros 'tipos' comunes que necesitan adaptarse a los tipos de datos existentes
Cuando sea apropiado, cada página del tema debe incluir, además de la sintaxis y los ejemplos:
- Consideraciones al alterar
- Tamaño (bytes)
- Contraste con los motores que no son MySQL (baja prioridad)
- Consideraciones al utilizar el tipo de datos en una CLAVE PRIMARIA o clave secundaria
- otra mejor práctica
- otros problemas de rendimiento
(Supongo que este "ejemplo" se auto distraccionará cuando mis sugerencias hayan sido satisfechas o vetadas).
Introducción (numérica)
MySQL ofrece una serie de diferentes tipos numéricos. Estos se pueden dividir en
Grupo | Los tipos |
---|---|
Tipos enteros | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Tipos de puntos fijos | DECIMAL , NUMERIC |
Tipos de punto flotante | FLOAT , DOUBLE |
Tipo de valor de bit | BIT |
Tipos enteros
El valor mínimo sin firmar es siempre 0.
Tipo | Almacenamiento (Bytes) | Valor mínimo (Firmado) | Valor máximo (Firmado) | Valor máximo (No firmado) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 |
SMALLINT | 2 | -2 15 -32,768 | 2 15 -1 32.767 | 2 16 -1 65,535 |
MEDIUMINT | 3 | -2 23 -8,388,608 | 2 23 -1 8,388,607 | 2 24 -1 16,777,215 |
INT | 4 | -2 31 -2,147,483,648 | 2 31 -1 2,147,483,647 | 2 32 -1 4,294,967,295 |
BIGINT | 8 | -2 63 -9,223,372,036,854,775,808 | 2 63 -1 9.223.372.036.854.775.807 | 2 64 -1 18,446,744,073,709,551,615 |
Tipos de puntos fijos
Los tipos DECIMAL
y NUMERIC
MySQL almacenan valores de datos numéricos exactos. Se recomienda utilizar estos tipos para preservar la precisión exacta, como por ejemplo, por dinero.
Decimal
Estos valores se almacenan en formato binario. En una declaración de columna, se debe especificar la precisión y la escala.
La precisión representa el número de dígitos significativos que se almacenan para los valores.
La escala representa el número de dígitos almacenados después del decimal
salary DECIMAL(5,2)
5 representa la precision
y 2 representa la scale
. Para este ejemplo, el rango de valores que se pueden almacenar en esta columna es de -999.99 to 999.99
Si se omite el parámetro de escala, el valor predeterminado es 0
Este tipo de datos puede almacenar hasta 65 dígitos.
El número de bytes tomados por DECIMAL(M,N)
es aproximadamente M/2
.
Tipos de punto flotante
FLOAT
y DOUBLE
representan tipos de datos aproximados .
Tipo | Almacenamiento | Precisión | Distancia |
---|---|---|---|
FLOTADOR | 4 bytes | 23 bits significativos / ~ 7 dígitos decimales | 10 ^ + / - 38 |
DOBLE | 8 bytes | 53 bits significativos / ~ 16 dígitos decimales | 10 ^ + / - 308 |
REAL
es un sinónimo de FLOAT
. DOUBLE PRECISION
es sinónimo de DOUBLE
.
Aunque MySQL también permite el calificador (M, D), no lo use. (M, D) significa que los valores se pueden almacenar con hasta M dígitos totales, donde D puede estar después del decimal. Los números se redondearán dos veces o se truncarán; Esto causará más problemas que beneficios.
Debido a que los valores de punto flotante son aproximados y no se almacenan como valores exactos, los intentos de tratarlos como exactos en las comparaciones pueden llevar a problemas. Tenga en cuenta en particular que un valor FLOAT
rara vez es igual a un valor DOUBLE
.
Tipo de valor de bit
El tipo BIT
es útil para almacenar valores de campo de bits. BIT(M)
permite el almacenamiento de hasta valores de M-bit donde M está en el rango de 1 to 64
También puede especificar valores con notación de bit value
.
b'111' -> 7
b'10000000' -> 128
A veces es útil usar 'shift' para construir un valor de un solo bit, por ejemplo (1 << 7)
para 128.
El tamaño máximo combinado de todas las columnas BIT en una tabla NDB
es 4096.
CHAR (n)
CHAR(n)
es una cadena de una longitud fija de n
caracteres . Si es un conjunto de CHARACTER SET utf8mb4
, eso significa que ocupa exactamente 4*n
bytes , independientemente del texto que CHARACTER SET utf8mb4
.
La mayoría de los casos de uso para CHAR(n)
involucran cadenas que contienen caracteres en inglés, por lo tanto, debe ser CHARACTER SET ascii
. ( latin1
hará tan bien).
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
FECHA, DATETIME, TIMESTAMP, AÑO, Y HORA
El tipo de datos DATE
comprende la fecha pero no el componente de hora. Su formato es 'YYYY-MM-DD'
con un rango de '1000-01-01' a '9999-12-31'.
El tipo DATETIME
incluye la hora con el formato 'YYYY-MM-DD HH: MM: SS'. Tiene un rango desde '1000-01-01 00:00:00' a '9999-12-31 23:59:59'.
El tipo TIMESTAMP
es un tipo entero que comprende la fecha y la hora con un rango efectivo desde '1970-01-01 00:00:01' UTC hasta '2038-01-19 03:14:07' UTC.
El tipo YEAR
representa un año y tiene un rango de 1901 a 2155.
El tipo de TIME
representa una hora con un formato de 'HH: MM: SS' y tiene un rango de '-838: 59: 59' a '838: 59: 59'.
Requisitos de almacenamiento:
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
Segundos fraccionarios (a partir de la versión 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
Consulte los tipos de FECHA, FECHA, FECHA y TIMESTAMP de las páginas del manual de MySQL, los requisitos de almacenamiento del tipo de datos y los segundos fraccionarios en los valores de tiempo .