AnalyticDB for MySQL prend en charge un ensemble de types de données SQL fondamentaux, répartis entre les catégories numériques, les chaînes, les dates et heures, ainsi que les données spatiales. Cette rubrique décrit la taille de stockage, la plage de valeurs et les différences par rapport à MySQL standard pour chaque type, suivies des règles de conversion implicite de type.
Types de données pris en charge
Types numériques
| Type | Alias | Plage de valeurs | Taille | Notes |
|---|---|---|---|---|
BOOLEAN |
— | 0 (false), 1 (true) |
1 bit | Aucune différence par rapport à MySQL. |
TINYINT |
— | -128 à 127 |
1 octet | Aucune différence par rapport à MySQL. |
SMALLINT |
— | -32768 à 32767 |
2 octets | Aucune différence par rapport à MySQL. |
INT ou INTEGER |
— | -2147483648 à 2147483647 |
4 octets | Correspond aux types MySQL INT ou MEDIUMINT. |
BIGINT |
— | -9223372036854775808 à 9223372036854775807 |
8 octets | Aucune différence par rapport à MySQL. |
FLOAT |
— | -3.402823466E+38 à -1.175494351E-38, 0, 1.175494351E-38 à 3.402823466E+38 |
4 octets | Conforme à la norme IEEE. Aucune différence par rapport à MySQL. |
DOUBLE |
— | -1.7976931348623157E+308 à -2.2250738585072014E-308, 0, 2.2250738585072014E-308 à 1.7976931348623157E+308 |
8 octets | Conforme à la norme IEEE. Aucune différence par rapport à MySQL. |
DECIMAL(m,d) ou NUMERIC |
— | m : précision maximale 1–38 ; d : échelle décimale, doit être ≤ m |
— |
MySQL prend en charge une précision maximale de
|
Types de chaînes
| Type | Description | Équivalent MySQL |
|---|---|---|
VARCHAR |
Jusqu'à 16 Mo. Un spécificateur de longueur tel que VARCHAR(255) est accepté pour la compatibilité syntaxique — le maximum réel est déterminé par la taille des données (jusqu'à 16 Mo), et non par le nombre déclaré. Ne vous fiez pas à la longueur déclarée pour la validation. |
CHAR, VARCHAR, TEXT, MEDIUMTEXT ou LONGTEXT |
BINARY |
Longueur des caractères stockés. | BINARY, VARBINARY ou BLOB |
Types temporels
| Type | Plage de valeurs | Format | Taille | Notes |
|---|---|---|---|---|
DATE |
'0001-01-01' à '9999-12-31' |
YYYY-MM-DD |
4 octets | MySQL prend en charge 0000-00-00 ; AnalyticDB for MySQL valide les valeurs temporelles et convertit 0000-00-00 en NULL. Utilisez des dates réelles. |
TIME |
'00:00:00' à '23:59:59' |
HH:MM:SS |
8 octets | MySQL prend en charge une précision personnalisée ; AnalyticDB for MySQL prend en charge une précision au niveau de la milliseconde (jusqu'à trois décimales). |
DATETIME |
'0001-01-01 00:00:00.000' à '9999-12-31 23:59:59.999' |
YYYY-MM-DD HH:MM:SS |
8 octets | Stocké en UTC. Le fuseau horaire ne peut pas être modifié. MySQL prend en charge 0000-00-00 et une précision personnalisée ; AnalyticDB for MySQL convertit 0000-00-00 en NULL. |
TIMESTAMP |
'0100-01-01 00:00:00.000' à '9999-12-31 23:59:59.999' |
YYYY-MM-DD HH:MM:SS |
8 octets | Utilise le fuseau horaire du système par défaut ; vous pouvez spécifier un fuseau horaire différent par session. MySQL prend en charge une précision personnalisée ; AnalyticDB for MySQL prend en charge une précision au niveau de la milliseconde (jusqu'à trois décimales). |
DATETIME utilise toujours UTC. Contrairement à TIMESTAMP, le fuseau horaire des valeurs DATETIME ne peut pas être remplacé au niveau de la session.
Types spatiaux
| Type | Description | Notes |
|---|---|---|
POINT |
Coordonnées géographiques x et y. | Aucune différence par rapport à MySQL. |
Conversion implicite de type
AnalyticDB for MySQL effectue automatiquement une conversion implicite de type en fonction du contexte lorsque vous exécutez des requêtes SQL. Les règles de conversion diffèrent entre les projections SELECT et les filtres WHERE.
La conversion implicite de type s'applique uniquement aux types de données de base. Les types de données complexes ne prennent pas en charge la conversion implicite de type. Pour les cas où les règles par défaut ne répondent pas à vos besoins, utilisez la conversion explicite de type.
Règles de conversion pour les projections
Lorsqu'une colonne dans une instruction SELECT est comparée à une constante, le résultat est implicitement converti vers le type indiqué dans le tableau suivant. Si la conversion n'est pas prise en charge, une erreur se produit.
| Colonne \ 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 | Non pris en charge | DOUBLE | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| TINYINT | BIGINT | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| SMALLINT | BIGINT | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| 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 | Non pris en charge | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DOUBLE | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
| TIME | TIME | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT | BIGINT | Non pris en charge | DOUBLE | TIME | BIGINT | BIGINT | DATETIME |
| DATE | DATE | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT | BIGINT | Non pris en charge | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
| TIMESTAMP | TIMESTAMP | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT | BIGINT | Non pris en charge | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
| DATETIME | DATETIME | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT | BIGINT | Non pris en charge | DOUBLE | DATETIME | DATETIME | DATETIME | DATETIME |
Règles de conversion pour les filtres
Lorsqu'une colonne dans une clause WHERE est comparée à une constante d'un type différent, le type de résultat est implicitement converti. Des types incompatibles peuvent empêcher le pushdown — l'optimisation qui pousse les conditions de filtre vers la couche de stockage pour un filtrage basé sur les index. Lorsque le pushdown échoue, la base de données revient à une analyse complète de la table, ce qui réduit considérablement les performances des requêtes.
Le tableau ci-dessous indique le type de résultat et l'état du pushdown pour chaque paire colonne-constante. ✓ = le pushdown réussit ; ✗ = le pushdown échoue (analyse complète de la table).
| Colonne \ 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 ✗ | Non pris en charge | REAL ✗ | DOUBLE ✗ | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| TINYINT | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| SMALLINT | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| 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 ✗ | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| REAL | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | DOUBLE ✗ | Non pris en charge | Non pris en charge | Non pris en charge | Non pris en charge |
| DOUBLE | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ |
| TIME | TIME ✓ | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT ✗ | BIGINT ✗ | Non pris en charge | Non pris en charge | DOUBLE ✗ | TIME ✓ | BIGINT ✗ | BIGINT ✗ | DATETIME ✗ |
| DATE | DATE ✓ | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT ✗ | BIGINT ✗ | Non pris en charge | Non pris en charge | DOUBLE ✗ | BIGINT ✗ | DATE ✓ | TIMESTAMP ✗ | DATETIME ✗ |
| TIMESTAMP | TIMESTAMP ✓ | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT ✗ | BIGINT ✗ | Non pris en charge | Non pris en charge | DOUBLE ✗ | TIMESTAMP ✓ | TIMESTAMP ✓ | TIMESTAMP ✓ | TIMESTAMP ✓ |
| DATETIME | DATETIME ✓ | Non pris en charge | Non pris en charge | Non pris en charge | BIGINT ✗ | BIGINT ✗ | Non pris en charge | Non pris en charge | DOUBLE ✗ | DATETIME ✓ | DATETIME ✓ | DATETIME ✓ | DATETIME ✓ |
Optimisation de la conversion forcée de type (ENFORCE_UNWRAP_CAST)
ENFORCE_UNWRAP_CAST contrôle la manière dont AnalyticDB for MySQL gère la conversion implicite de type dans les conditions de filtre. Lorsqu'il est activé, le système convertit la constante pour qu'elle corresponde au type de la colonne plutôt que l'inverse, préservant ainsi l'optimisation du pushdown et évitant les résultats inattendus dus à la troncature des valeurs.
Configuration de ENFORCE_UNWRAP_CAST
Deux méthodes de configuration sont disponibles :
-
Globale — s'applique à toutes les requêtes du cluster :
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true; -
Indice de requête — s'applique à une seule requête sans affecter les autres :
/*+ ENFORCE_UNWRAP_CAST=true */
Exemple
La colonne col de la table test est de type VARCHAR et contient les valeurs '1', '1a' et 'abc'. L'exécution de la requête suivante produit des résultats différents selon que ENFORCE_UNWRAP_CAST est activé ou non :
SELECT col FROM test WHERE col = 1;
| Paramètre | Comportement | Lignes correspondantes | Pushdown |
|---|---|---|---|
ENFORCE_UNWRAP_CAST=false (par défaut) |
Convertit la colonne VARCHAR en BIGINT. '1' et '1a' sont tous deux tronqués en 1 et correspondent. |
'1', '1a' |
Échec — analyse complète de la table |
ENFORCE_UNWRAP_CAST=true |
Convertit la constante INTEGER 1 en VARCHAR '1'. Seule une correspondance exacte de chaîne est qualifiée. |
'1' uniquement |
Succès — pushdown au niveau du stockage |
Activez ENFORCE_UNWRAP_CAST lorsque les colonnes sont déclarées comme des types de chaîne mais interrogées avec des constantes numériques, afin d'obtenir des résultats précis et d'éviter les analyses complètes de table.