AnalyticDB for MySQL admite un conjunto fundamental de tipos de datos SQL en las categorías numérica, de cadena, de tiempo y espacial. Esta página describe el tamaño de almacenamiento, el rango de valores y las diferencias respecto a MySQL estándar para cada tipo, además de las reglas de conversión implícita de tipos.
Tipos de datos compatibles
Tipos numéricos
| Tipo | Alias | Rango de valores | Tamaño | Notas |
|---|---|---|---|---|
BOOLEAN |
— | 0 (falso), 1 (verdadero) |
1 bit | Sin diferencias respecto a MySQL. |
TINYINT |
— | -128 a 127 |
1 byte | Sin diferencias respecto a MySQL. |
SMALLINT |
— | -32768 a 32767 |
2 bytes | Sin diferencias respecto a MySQL. |
INT o INTEGER |
— | -2147483648 a 2147483647 |
4 bytes | Corresponde a INT o MEDIUMINT de MySQL. |
BIGINT |
— | -9223372036854775808 a 9223372036854775807 |
8 bytes | Sin diferencias respecto a MySQL. |
FLOAT |
— | -3.402823466E+38 a -1.175494351E-38, 0, 1.175494351E-38 a 3.402823466E+38 |
4 bytes | Cumple con el estándar IEEE. Sin diferencias respecto a MySQL. |
DOUBLE |
— | -1.7976931348623157E+308 a -2.2250738585072014E-308, 0, 2.2250738585072014E-308 a 1.7976931348623157E+308 |
8 bytes | Cumple con el estándar IEEE. Sin diferencias respecto a MySQL. |
DECIMAL(m,d) o NUMERIC |
— | m: precisión máxima 1–38; d: escala decimal, debe ser ≤ m |
— |
MySQL admite una precisión máxima de
|
Tipos de cadena
|
Tipo |
Descripción |
Equivalente en MySQL |
|
|
Hasta 16 MB. Se acepta un especificador de longitud como |
|
|
|
Longitud de los caracteres de almacenamiento. |
|
Tipos de tiempo
|
Tipo |
Rango de valores |
Formato |
Tamaño |
Notas |
|
|
De |
|
4 bytes |
MySQL admite |
|
|
De |
|
8 bytes |
MySQL admite precisión personalizada; AnalyticDB for MySQL admite precisión a nivel de milisegundos (hasta tres decimales). |
|
|
De |
|
8 bytes |
Se almacena en UTC. La zona horaria no se puede cambiar. MySQL admite |
|
|
De |
|
8 bytes |
Usa la zona horaria del sistema de forma predeterminada; puede especificar una zona horaria diferente por sesión. MySQL admite precisión personalizada; AnalyticDB for MySQL admite precisión a nivel de milisegundos (hasta tres decimales). |
DATETIME siempre usa UTC. A diferencia de TIMESTAMP, la zona horaria para los valores DATETIME no se puede anular por sesión.
Tipos espaciales
|
Tipo |
Descripción |
Notas |
|
|
Coordenadas geográficas x e y. |
Sin diferencias respecto a MySQL. |
Conversión implícita de tipos
AnalyticDB for MySQL realiza la conversión implícita de tipos automáticamente según el contexto al ejecutar consultas SQL. Las reglas de conversión difieren entre las proyecciones SELECT y los filtros WHERE.
La conversión implícita de tipos solo aplica a los tipos de datos básicos. Complex data types no admiten conversión implícita de tipos. Para los casos en que las reglas predeterminadas no satisfagan sus necesidades, utilice explicit type conversion.
Reglas de conversión de proyección
Cuando una columna en una instrucción SELECT se compara con una constante, el resultado se convierte implícitamente al tipo que se muestra en la siguiente tabla. Si la conversión no es compatible, se produce un error.
|
Columna \ Constante |
VARCHAR |
BOOLEAN |
TINYINT |
SMALLINT |
INTEGER |
BIGINT |
DECIMAL |
DOUBLE |
TIME |
DATE |
TIMESTAMP |
DATETIME |
|
VARCHAR |
VARCHAR |
BOOLEAN |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
DECIMAL |
DOUBLE |
TIME |
DATE |
TIMESTAMP |
DATETIME |
|
BOOLEAN |
BOOLEAN |
BOOLEAN |
TINYINT |
SMALLINT |
INTEGER |
BIGINT |
No compatible |
DOUBLE |
No compatible |
No compatible |
No compatible |
No compatible |
|
TINYINT |
BIGINT |
TINYINT |
TINYINT |
SMALLINT |
INTEGER |
BIGINT |
DECIMAL |
DOUBLE |
No compatible |
No compatible |
No compatible |
No compatible |
|
SMALLINT |
BIGINT |
SMALLINT |
SMALLINT |
SMALLINT |
INTEGER |
BIGINT |
DECIMAL |
DOUBLE |
No compatible |
No compatible |
No compatible |
No compatible |
|
INTEGER |
BIGINT |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
BIGINT |
DECIMAL |
DOUBLE |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
|
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
DECIMAL |
DOUBLE |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
|
DECIMAL |
DECIMAL |
No compatible |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DOUBLE |
No compatible |
No compatible |
No compatible |
No compatible |
|
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
|
TIME |
TIME |
No compatible |
No compatible |
No compatible |
BIGINT |
BIGINT |
No compatible |
DOUBLE |
TIME |
BIGINT |
BIGINT |
DATETIME |
|
DATE |
DATE |
No compatible |
No compatible |
No compatible |
BIGINT |
BIGINT |
No compatible |
DOUBLE |
BIGINT |
TIMESTAMP |
TIMESTAMP |
DATETIME |
|
TIMESTAMP |
TIMESTAMP |
No compatible |
No compatible |
No compatible |
BIGINT |
BIGINT |
No compatible |
DOUBLE |
BIGINT |
TIMESTAMP |
TIMESTAMP |
DATETIME |
|
DATETIME |
DATETIME |
No compatible |
No compatible |
No compatible |
BIGINT |
BIGINT |
No compatible |
DOUBLE |
DATETIME |
DATETIME |
DATETIME |
DATETIME |
Reglas de conversión de filtros
Cuando una columna en una cláusula WHERE se compara con una constante de un tipo diferente, el tipo resultante se convierte implícitamente. Los tipos no coincidentes pueden impedir el pushdown, que es la optimización que envía las condiciones de filtro a la capa de almacenamiento para realizar un filtrado basado en índices. Cuando el pushdown falla, la base de datos recurre a un escaneo completo de la tabla, lo cual reduce significativamente el rendimiento de la consulta.
La siguiente tabla muestra el tipo resultante y el estado del pushdown para cada par de tipos columna-constante. ✓ = pushdown exitoso; ✗ = pushdown fallido (escaneo completo de tabla).
|
Columna \ Constante |
VARCHAR |
BOOLEAN |
TINYINT |
SMALLINT |
INTEGER |
BIGINT |
DECIMAL |
REAL |
DOUBLE |
TIME |
DATE |
TIMESTAMP |
DATETIME |
|
VARCHAR |
VARCHAR ✓ |
BOOLEAN ✗ |
BIGINT ✗ |
BIGINT ✗ |
BIGINT ✗ |
BIGINT ✗ |
DECIMAL ✗ |
REAL ✗ |
DOUBLE ✗ |
TIME ✗ |
DATE ✗ |
TIMESTAMP ✗ |
DATETIME ✗ |
|
BOOLEAN |
BOOLEAN ✓ |
BOOLEAN ✓ |
TINYINT ✗ |
SMALLINT ✗ |
INTEGER ✗ |
BIGINT ✗ |
No compatible |
REAL ✗ |
DOUBLE ✗ |
No compatible |
No compatible |
No compatible |
No compatible |
|
TINYINT |
TINYINT ✓ |
TINYINT ✓ |
TINYINT ✓ |
TINYINT ✓ |
TINYINT ✓ |
TINYINT ✓ |
DECIMAL ✗ |
REAL ✗ |
DOUBLE ✗ |
No compatible |
No compatible |
No compatible |
No compatible |
|
SMALLINT |
SMALLINT ✓ |
SMALLINT ✓ |
SMALLINT ✓ |
SMALLINT ✓ |
SMALLINT ✓ |
SMALLINT ✓ |
DECIMAL ✗ |
REAL ✗ |
DOUBLE ✗ |
No compatible |
No compatible |
No compatible |
No compatible |
|
INTEGER |
INTEGER ✓ |
INTEGER ✓ |
INTEGER ✓ |
INTEGER ✓ |
INTEGER ✓ |
INTEGER ✓ |
DECIMAL ✗ |
REAL ✗ |
DOUBLE ✗ |
INTEGER ✓ |
INTEGER ✓ |
INTEGER |
INTEGER |
|
BIGINT |
BIGINT ✓ |
BIGINT ✓ |
BIGINT ✓ |
BIGINT ✓ |
BIGINT ✓ |
BIGINT ✓ |
DECIMAL ✗ |
REAL ✗ |
DOUBLE ✗ |
BIGINT ✓ |
BIGINT ✓ |
BIGINT |
BIGINT |
|
DECIMAL |
DECIMAL ✓ |
DECIMAL ✓ |
DECIMAL ✓ |
DECIMAL ✓ |
DECIMAL ✓ |
DECIMAL ✓ |
DECIMAL ✓ |
REAL ✗ |
DOUBLE ✗ |
No compatible |
No compatible |
No compatible |
No compatible |
|
REAL |
REAL ✓ |
REAL ✓ |
REAL ✓ |
REAL ✓ |
REAL ✓ |
REAL ✓ |
REAL ✓ |
REAL ✓ |
DOUBLE ✗ |
No compatible |
No compatible |
No compatible |
No compatible |
|
DOUBLE |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
DOUBLE ✓ |
|
TIME |
TIME ✓ |
No compatible |
No compatible |
No compatible |
BIGINT ✗ |
BIGINT ✗ |
No compatible |
No compatible |
DOUBLE ✗ |
TIME ✓ |
BIGINT ✗ |
BIGINT ✗ |
DATETIME ✗ |
|
DATE |
DATE ✓ |
No compatible |
No compatible |
No compatible |
BIGINT ✗ |
BIGINT ✗ |
No compatible |
No compatible |
DOUBLE ✗ |
BIGINT ✗ |
DATE ✓ |
TIMESTAMP ✗ |
DATETIME ✗ |
|
TIMESTAMP |
TIMESTAMP ✓ |
No compatible |
No compatible |
No compatible |
BIGINT ✗ |
BIGINT ✗ |
No compatible |
No compatible |
DOUBLE ✗ |
TIMESTAMP ✓ |
TIMESTAMP ✓ |
TIMESTAMP ✓ |
TIMESTAMP ✓ |
|
DATETIME |
DATETIME ✓ |
No compatible |
No compatible |
No compatible |
BIGINT ✗ |
BIGINT ✗ |
No compatible |
No compatible |
DOUBLE ✗ |
DATETIME ✓ |
DATETIME ✓ |
DATETIME ✓ |
DATETIME ✓ |
Optimización de conversión forzada de tipos (ENFORCE_UNWRAP_CAST)
ENFORCE_UNWRAP_CAST controla cómo AnalyticDB for MySQL maneja la conversión implícita de tipos en las condiciones de filtro. Cuando está habilitado, el sistema convierte la constante para que coincida con el tipo de la columna en lugar de hacerlo al revés; esto preserva la optimización de pushdown y evita resultados inesperados por truncamiento de valores.
Configurar ENFORCE_UNWRAP_CAST
Hay dos métodos de configuración disponibles:
-
Global: se aplica a todas las consultas del clúster.
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true; -
Query hint: se aplica a una sola consulta sin afectar a las demás.
/*+ ENFORCE_UNWRAP_CAST=true */
Ejemplo
La columna col de la tabla test es de tipo VARCHAR y contiene los valores '1', '1a' y 'abc'. Al ejecutar la siguiente consulta se obtienen resultados diferentes dependiendo de si ENFORCE_UNWRAP_CAST está habilitado:
SELECT col FROM test WHERE col = 1;
|
Configuración |
Comportamiento |
Filas coincidentes |
Pushdown |
|
|
Convierte la columna VARCHAR a BIGINT. Tanto |
|
Falla: escaneo completo de tabla |
|
|
Convierte la constante INTEGER |
Solo |
Exitoso: pushdown en capa de almacenamiento |
Habilite ENFORCE_UNWRAP_CAST cuando las columnas estén declaradas como tipos de cadena pero se consulten con constantes numéricas, a fin de obtener resultados precisos y evitar escaneos completos de tabla.