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 motor MEMORY , que coloca los datos en la RAM. Pero los VARCHARs se convierten en CHAR en el proceso. Esto hace que VARCHAR(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 de CHARACTER SET (por ejemplo, 4 bytes / carácter para utf8mb4).
  • Con CHAR , use CHARACTER 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 los SELECTs 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 .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow