Tous les produits
Search
Centre de documentation

Hologres:Migration des données MySQL vers Hologres

Dernière mise à jour :Aug 11, 2026

Hologres étant compatible avec PostgreSQL, la migration depuis MySQL nécessite de mapper les types de données et d'adapter les requêtes SQL. Cette rubrique présente les méthodes de synchronisation disponibles, le mappage des types de données ainsi que les différences de requêtes et de fonctions à prendre en compte après la migration.

Choisir une méthode de synchronisation

Le tableau suivant répertorie les méthodes de synchronisation disponibles pour migrer les données MySQL vers Hologres. Pour le traitement ETL (Extract, Transform, Load), utilisez Flink afin de lire les données depuis MySQL et de les écrire dans Hologres. Pour plus d'informations, consultez Realtime Compute for Apache Flink.

|
**Méthode**
|
**Cas d'utilisation**
|
**Documentation**
| | --- | --- | --- | |
Chargement d'une table unique
|
Synchronisez les données d'une seule table MySQL vers Hologres via une opération par lot ponctuelle.
|
[Importation de données par lot avec DataWorks](t1881801.dita#task_1935426)
| |
Synchronisation en temps réel d'une table unique
|
Diffusez les modifications d'une seule table MySQL vers Hologres à l'aide du journal binaire MySQL (Binlog).
|
[Configuration d'une source de données MySQL](t2042810.dita#task_2013003)
| |
Synchronisation en temps réel d'une base de données entière
|
Diffusez les modifications d'une base de données MySQL entière vers Hologres en temps réel.
|
[Configuration et gestion d'un nœud de synchronisation en temps réel](t2040725.dita#task_2473945)
| |
Solution de synchronisation
|
Utilisez Data Integration pour synchroniser plusieurs tables en une seule opération, avec une synchronisation complète des données suivie d'une synchronisation incrémentielle continue.
|
[Configuration d'une source de données MySQL](t2013004.dita#task_2013003)
|





























Mappage des types de données

Utilisez le tableau suivant pour mapper les types MySQL aux types Hologres. Pour une référence complète des types Hologres, consultez Présentation des types de données.

Règles essentielles avant de commencer :

  • Dimensionnement des entiers : Hologres propose trois types d'entiers — SMALLINT (2 octets), INTEGER (4 octets) et BIGINT (8 octets) — contre cinq pour MySQL. Mappez chaque entier MySQL vers un type Hologres dont la taille en octets est égale ou supérieure.

  • Entiers non signés : Hologres ne prend pas en charge les entiers non signés. Anticipez les dépassements potentiels lors du mappage des champs non signés et utilisez un type entier plus grand ou TEXT si les valeurs risquent de dépasser la plage cible.

  • Types texte : Mappez toutes les variantes de texte MySQL (TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT) vers TEXT dans Hologres.

  • DATETIME et fuseaux horaires : DATETIME de MySQL ne gère aucun fuseau horaire et utilise le format YYYY-MM-DD HH:MM:SS. Par défaut, il correspond au type TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE) dans Hologres. Pour utiliser un TIMESTAMP sans fuseau horaire, spécifiez-le explicitement dans votre configuration de synchronisation ou dans l'instruction de création de table.

|
**Type MySQL**
|
**Type Hologres**
|
**Notes**
| | --- | --- | --- | |
BIGINT
|
BIGINT
| | |
BIGINT(20) UNSIGNED
|
TEXT
|
Hologres ne prend pas en charge les entiers non signés. Le type TEXT permet d'éviter tout risque de dépassement.
| |
BINARY(n)
|
BYTEA
| | |
BIT
|
BOOLEAN
| | |
CHAR(n), CHARACTER(n)
|
CHAR(n), CHARACTER(n)
| | |
DATE
|
DATE
| | |
DATETIME
|
TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE)
|
DATETIME de MySQL ne gère aucun fuseau horaire. Il correspond par défaut à TIMESTAMPTZ. Spécifiez explicitement TIMESTAMP pour désactiver cette option.
| |
DECIMAL(p,s), DEC(p,s)
|
DECIMAL(p,s), DEC(p,s)
| | |
DOUBLE
|
DOUBLE PRECISION
| | |
FLOAT
|
REAL
| | |
INT, INTEGER
|
INT, INTEGER
| | |
MEDIUMINT
|
INTEGER
|
MEDIUMINT occupe 3 octets ; INTEGER en occupe 4, ce qui correspond au type entier supérieur suivant dans Hologres.
| |
NUMERIC(p,s)
|
NUMERIC(p,s)
| | |
SMALLINT
|
SMALLINT
| | |
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
|
BYTEA
| | |
TINYINT
|
SMALLINT
|
TINYINT occupe 1 octet ; SMALLINT est le plus petit type entier de Hologres (2 octets).
| |
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
|
TEXT
|
Toutes les variantes de texte MySQL correspondent au type TEXT.
| |
TIME
|
TIME [WITHOUT TIME ZONE]
| | |
TIMESTAMP
|
TIMESTAMP [WITH TIME ZONE]
| | |
VARBINARY(n), VARBINARY(max)
|
BYTEA
| | |
VARCHAR(n)
|
VARCHAR(n)
| | |
VARCHAR(max)
|
TEXT
| |







































































































Différences de syntaxe des requêtes

Hologres étant compatible avec PostgreSQL, plusieurs modèles de requête MySQL doivent être adaptés.

Guillemets

Par défaut, Hologres ne respecte pas la casse. Pour faire référence à un identifiant sensible à la casse, encadrez-le avec des guillemets doubles ("").

Remplacez la syntaxe des accents graves de MySQL par des guillemets doubles :

-- MySQL
SELECT `A` FROM b;

-- Hologres
SELECT "A" FROM b;

Conditions de filtrage

Hologres impose une correspondance exacte des types dans les conditions de filtrage et n'effectue aucune conversion implicite de type. En cas de discordance, vous obtenez une erreur telle que :

operator does not exist: text = integer

Pour résoudre ce problème, créez des conversions de type personnalisées :

CREATE CAST (TEXT AS INTEGER) WITH INOUT AS IMPLICIT;
CREATE CAST (TEXT AS BIGINT) WITH INOUT AS IMPLICIT;
CREATE CAST (TEXT AS DECIMAL) WITH INOUT AS IMPLICIT;
CREATE CAST (TEXT AS TIMESTAMP) WITH INOUT AS IMPLICIT;
CREATE CAST (NUMERIC AS TEXT) WITH INOUT AS IMPLICIT;

Exemple : Si la colonne ds est de type TEXT et que vous appliquez un filtre avec une valeur entière, la requête suivante échoue dans Hologres :

SELECT * FROM business_module WHERE ds = 20210329;

Après avoir créé la conversion appropriée, la requête s'exécute sans erreur.

Pagination

Remplacez la syntaxe LIMIT à deux arguments de MySQL par la forme standard OFFSET/LIMIT :

-- MySQL
LIMIT 0, 10

-- Hologres
OFFSET 0 LIMIT 10

Tri

MySQL et Hologres diffèrent dans leur manière de trier les valeurs NULL par ordre croissant :

|
**Base de données**
|
**ASC par défaut**
|
**DESC par défaut**
| | --- | --- | --- | |
MySQL
|
NULLS FIRST
|
NULLS FIRST
| |
Hologres
|
NULLS LAST
|
NULLS FIRST
|

Pour obtenir des résultats cohérents, spécifiez explicitement l'ordre de tri des valeurs NULL :

ORDER BY column DESC NULLS LAST


















Regroupement

Par défaut, Hologres ne prend pas en charge GROUP BY sur les types inexacts (FLOAT, DOUBLE). Deux options s'offrent à vous :

  • Convertissez la colonne en DECIMAL avant le regroupement.

  • Activez le paramètre hg_experimental_enable_double_equivalent :

    -- Session level
    SET hg_experimental_enable_double_equivalent = on;
    
    -- Database level
    ALTER DATABASE <database_name> SET hg_experimental_enable_double_equivalent = on;
Ce paramètre nécessite Hologres V0.10 ou une version ultérieure. Si votre instance exécute une version antérieure, contactez le support technique via le groupe DingTalk Hologres pour demander une mise à niveau. Pour plus de détails, consultez Comment obtenir davantage de support en ligne ? .

UNION

L'opérateur UNION exige que les types de colonnes correspondent dans toutes les requêtes. MySQL effectue une conversion implicite de type, contrairement à Hologres. Une incompatibilité de type génère l'erreur suivante :

UNION types bigint and text cannot be matched

Convertissez explicitement les colonnes incompatibles :

-- Fails if project_id is BIGINT in tableA and TEXT in tableB
SELECT project_id FROM tableA
UNION ALL
SELECT project_id FROM tableB;

-- Fix: cast to a matching type
SELECT project_id FROM tableA
UNION ALL
SELECT CAST(project_id AS BIGINT) FROM tableB;

Différences de fonctions

Hologres prend en charge la plupart des fonctions compatibles avec PostgreSQL. Pour la liste complète, consultez Fonctions compatibles avec PostgreSQL. Les fonctions MySQL suivantes nécessitent une adaptation.

Division par zéro

MySQL renvoie NULL en cas de division par zéro. Hologres renvoie une erreur :

ERROR: division by zero

Option 1 : Utilisez NULLIF pour traiter le diviseur comme NULL lorsqu'il est égal à zéro :

SELECT a / NULLIF(b, 0) FROM table;

Option 2 (Hologres V1.3.21 et versions ultérieures) : Activez l'extension mysql_compatible pour tolérer la division par zéro sans modifier les requêtes individuelles :

-- Run once per database (requires Superuser)
CREATE EXTENSION IF NOT EXISTS mysql_compatible;

-- Enable division-by-zero tolerance for the current session
SET mysql_compatible.enable = on;

Cela couvre plusieurs scénarios :

-- Scenario 1: Constant division of the same type
SET mysql_compatible.enable = on;
SELECT 1 / 0;

-- Scenario 2: Constant division with type conversion
SET mysql_compatible.enable = on;
SELECT 1.0 / 0;

-- Scenario 3: Dividend is a column expression
SET mysql_compatible.enable = on;
SELECT SUM(c) / 0 FROM (SELECT generate_series(1, 100) AS c) AS t;

-- Scenario 4: Divisor is a column expression
SET mysql_compatible.enable = on;
SELECT MAX(c) / SUM(d)
FROM (
  SELECT generate_series(1, 101) AS c,
         generate_series(-50, 50) AS d
) AS t;

-- Scenario 5: Tolerate division by zero during INSERT
CREATE TABLE IF NOT EXISTS test_insert_divide_by_zero (c1 INT);
SET mysql_compatible.strict_mode = off;
SET mysql_compatible.enable = on;
INSERT INTO test_insert_divide_by_zero SELECT 100 / 0.0;

Si vous rencontrez des problèmes, consultez Erreurs courantes lors de la préparation de la mise à niveau ou contactez le support technique via le groupe DingTalk Hologres. Pour plus de détails, consultez Comment obtenir un support en ligne supplémentaire ?.

Division entière

MySQL renvoie une valeur décimale lors de la division de deux entiers avec un reste, tandis que Hologres tronque le résultat en un entier.

|
**Expression**
|
**Résultat MySQL**
|
**Résultat Hologres**
| | --- | --- | --- | |
5 / 2
|
2,5
|
2
|

Convertissez l'un des opérandes en un type à virgule flottante pour obtenir le résultat décimal :

SELECT 1 / 2::FLOAT;












Fonction IF

Hologres ne prend pas en charge la fonction IF. Remplacez-la par une expression CASE WHEN :

-- MySQL
IF(condition, true_value, false_value)

-- Hologres
CASE WHEN condition THEN true_value ELSE false_value END

Fonction IFNULL

Remplacez la fonction IFNULL de MySQL par COALESCE :

-- MySQL
IFNULL(x, y)

-- Hologres
COALESCE(x, y)

Fonction LENGTH

Remplacez la fonction LENGTH de MySQL par CHAR_LENGTH :

-- MySQL
LENGTH(string)

-- Hologres
CHAR_LENGTH(string)

FAQ

COUNT DISTINCT renvoie des résultats différents pour plusieurs colonnes

Symptôme : Une requête COUNT DISTINCT multicolumnes renvoie des nombres de lignes différents dans MySQL et Hologres.

Cause : La fonction count(distinct column_1, column_2, ...) de MySQL exclut les lignes où l'une des colonnes spécifiées est NULL. La fonction count(distinct(column_1, column_2, ...)) de Hologres inclut les lignes même lorsque certaines colonnes sont NULL, ce qui produit un compte plus élevé.

Correction : Concaténez les colonnes afin que toute valeur NULL se propage dans l'expression, reproduisant ainsi le comportement de MySQL :

SELECT count(distinct column_1 || column_2 || ...) FROM table;

Exemple :

CREATE TABLE count_distinct_test (
  a TEXT,
  b TEXT
);

INSERT INTO count_distinct_test VALUES
  ('a', 'b'),
  ('a', NULL),
  (NULL, 'b'),
  ('a', 'b');

-- Hologres default: includes rows with NULL columns → returns 3
SELECT count(distinct(a, b)::text) FROM count_distinct_test;

-- MySQL-compatible: NULL propagates through concatenation → returns 1
SELECT count(distinct a || b) FROM count_distinct_test;