Hologres PostgreSQL ile uyumludur; bu nedenle MySQL'den geçiş yaparken veri türlerini eşleştirmeniz ve SQL sorgularını uyarlamanız gerekir. Bu konuda, kullanılabilecek senkronizasyon yöntemleri, veri türü eşlemeleri ve geçiş sonrası karşılaşacağınız sorgu ve işlev farklılıkları ele alınmaktadır.
Bir senkronizasyon yöntemi seçin
Aşağıdaki tabloda, MySQL verilerini Hologres'e geçirmek için kullanılabilen senkronizasyon yöntemleri listelenmiştir. Çıkarma, Dönüştürme ve Yükleme (ETL) işlemleri için Flink kullanarak MySQL'den veri okuyup Hologres'e yazın. Daha fazla bilgi için bkz. Fully Managed Flink'e Giriş
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Veri türü eşleme
MySQL türlerini Hologres türlerine eşlemek için aşağıdaki tabloyu kullanın. Hologres türlerinin tam referansı için bkz. Veri Türlerine Genel Bakış.
Başlamadan önce dikkat etmeniz gereken temel kurallar şunlardır:
Tamsayı boyutu: Hologres'te üç tamsayı türü bulunur — SMALLINT (2 bayt), INTEGER (4 bayt) ve BIGINT (8 bayt) — MySQL'de ise beş tür vardır. Her MySQL tamsayısını, eşit veya daha büyük bayt boyutuna sahip bir Hologres türüne eşleyin.
İşaretsiz tamsayılar: Hologres işaretsiz tamsayıları desteklemez. İşaretsiz alanları eşlerken olası taşmaları hesaba katın ve değerler hedef aralığın dışına çıkabilecekse daha büyük bir tamsayı türü veya TEXT kullanın.
Metin türleri: Tüm MySQL metin varyantlarını (TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT) Hologres'te TEXT türüne eşleyin.
DATETIME ve saat dilimleri: MySQL DATETIME saat dilimi içermez ve
YYYY-MM-DD HH:MM:SSbiçimini kullanır. Varsayılan olarak, Hologres'teTIMESTAMPTZ(TIMESTAMP WITH TIME ZONE) türüne eşlenir. Saat dilimi içermeyen TIMESTAMP kullanmak için senkronizasyon yapılandırmanızda veya tablo oluşturma deyiminizde bunu açıkça belirtin.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sorgu sözdizimi farklılıkları
Hologres PostgreSQL ile uyumlu olduğundan, bazı MySQL sorgu kalıplarının uyarlanması gerekir.
Tırnak işaretleri
Hologres varsayılan olarak büyük/küçük harfe duyarlı değildir. Büyük/küçük harfe duyarlı bir tanımlayıcıya başvurmak için onu çift tırnak içine alın ("").
MySQL geri tırnak söz dizimini çift tırnakla değiştirin:
-- MySQL
SELECT `A` FROM b;
-- Hologres
SELECT "A" FROM b;
Filtre koşulları
Hologres, filtre koşullarında kesin tür eşleşmesi gerektirir ve örtük tür dönüştürme işlemi gerçekleştirmez. Türler eşleşmezse aşağıdakine benzer bir hata alırsınız:
operator does not exist: text = integer
Bu sorunu çözmek için özel tür dönüştürmeleri oluşturun:
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;
Örnek: ds sütunu TEXT türündeyse ve bir tamsayı değeriyle filtreleme yapıyorsanız, aşağıdaki sorgu Hologres'te başarısız olur:
SELECT * FROM business_module WHERE ds = 20210329;
Uygun dönüştürmeyi oluşturduktan sonra sorgu hatasız çalışır.
Sayfalama
MySQL'in iki bağımsız değişkenli LIMIT söz dizimini standart OFFSET/LIMIT biçimiyle değiştirin:
-- MySQL
LIMIT 0, 10
-- Hologres
OFFSET 0 LIMIT 10
Sıralama
MySQL ve Hologres, NULL değerlerini artan düzende sıralama konusunda farklılık gösterir:
|
|
|
|
|
|
|
|
|
|
|
|
Tutarlı sonuçlar elde etmek için NULL sıralama düzenini açıkça belirtin:
ORDER BY column DESC NULLS LAST
Gruplama
Hologres varsayılan olarak tam olmayan türlerde (FLOAT, DOUBLE) GROUP BY kullanımını desteklemez. İki seçenek mevcuttur:
Gruplamadan önce sütunu DECIMAL türüne dönüştürün.
-
hg_experimental_enable_double_equivalentparametresini etkinleştirin:-- Session level SET hg_experimental_enable_double_equivalent = on; -- Database level ALTER DATABASE <database_name> SET hg_experimental_enable_double_equivalent = on;
Bu parametre Hologres V0.10 veya sonraki sürümlerini gerektirir. Örneğiniz daha eski bir sürüm çalıştırıyorsa, yükseltme talebinde bulunmak üzere Hologres DingTalk grubu üzerinden teknik destekle iletişime geçin. Ayrıntılar için bkz. Daha fazla çevrimiçi desteği nasıl alırım? .
UNION
UNION operatörü, tüm sorgularda sütun türlerinin eşleşmesini gerektirir. MySQL örtük tür dönüştürme gerçekleştirirken Hologres bunu yapmaz. Tür uyuşmazlığı durumunda aşağıdaki hata oluşur:
UNION types bigint and text cannot be matched
Eşleşmeyen sütunları açıkça dönüştürün:
-- 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;
İşlev farklılıkları
Hologres, PostgreSQL ile uyumlu çoğu işlevi destekler. Tam liste için bkz. PostgreSQL ile Uyumlu İşlevler. Aşağıdaki MySQL işlevlerinin uyarlanması gerekir.
Sıfıra bölme
MySQL sıfıra bölme işleminde NULL döndürür. Hologres ise bir hata döndürür:
ERROR: division by zero
Seçenek 1: Bölen sıfır olduğunda NULL olarak değerlendirilmesi için NULLIF kullanın:
SELECT a / NULLIF(b, 0) FROM table;
Seçenek 2 (Hologres V1.3.21 ve sonrası): Tek tek sorguları değiştirmeden sıfıra bölmeye tolerans sağlamak için mysql_compatible uzantısını etkinleştirin:
-- 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;
Bu işlem birden çok senaryoyu kapsar:
-- 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;
Sorunlarla karşılaşırsanız bkz. Yaygın yükseltme hazırlığı hataları veya Hologres DingTalk grubu üzerinden teknik destekle iletişime geçin. Ayrıntılar için bkz. Ek çevrimiçi desteği nasıl alırım?.
Tamsayı bölmesi
MySQL, kalanlı iki tamsayıyı böldüğünde ondalık sayı döndürür; Hologres ise sonucu tamsayıya kırpıp yuvarlar.
|
|
|
|
|
|
|
|
Ondalık sonucu almak için işlenenlerden birini kayan nokta türüne dönüştürün:
SELECT 1 / 2::FLOAT;
IF işlevi
Hologres IF işlevini desteklemez. Bunun yerine CASE WHEN ifadesini kullanın:
-- MySQL
IF(condition, true_value, false_value)
-- Hologres
CASE WHEN condition THEN true_value ELSE false_value END
IFNULL işlevi
MySQL IFNULL işlevini COALESCE ile değiştirin:
-- MySQL
IFNULL(x, y)
-- Hologres
COALESCE(x, y)
LENGTH işlevi
MySQL LENGTH işlevini CHAR_LENGTH ile değiştirin:
-- MySQL
LENGTH(string)
-- Hologres
CHAR_LENGTH(string)
SSS
COUNT DISTINCT birden çok sütun için farklı sonuçlar döndürüyor
Belirti: Çok sütunlu bir COUNT DISTINCT sorgusu, MySQL ve Hologres'te farklı satır sayıları döndürür.
Neden: MySQL'deki count(distinct column_1, column_2, ...) ifadesi, belirtilen sütunlardan herhangi biri NULL olan satırları hariç tutar. Hologres'teki count(distinct(column_1, column_2, ...)) ifadesi ise bazı sütunlar NULL olsa bile satırları dahil eder; bu da daha yüksek bir sayımla sonuçlanır.
Çözüm: MySQL davranışını eşleştirmek için sütunları birleştirin; böylece herhangi bir NULL değeri ifade boyunca yayılır:
SELECT count(distinct column_1 || column_2 || ...) FROM table;
Örnek:
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;