AnalyticDB for MySQL mendukung rangkaian inti tipe data SQL yang mencakup kategori numerik, string, waktu, dan spasial. Halaman ini menjelaskan ukuran penyimpanan, rentang nilai, serta perbedaan masing-masing tipe dibandingkan dengan MySQL standar, diikuti oleh aturan konversi tipe implisit.
Tipe data yang didukung
Tipe numerik
| Type | Aliases | Value range | Size | Notes |
|---|---|---|---|---|
BOOLEAN |
— | 0 (false), 1 (true) |
1 bit | Tidak ada perbedaan dari MySQL. |
TINYINT |
— | -128 hingga 127 |
1 byte | Tidak ada perbedaan dari MySQL. |
SMALLINT |
— | -32768 hingga 32767 |
2 bytes | Tidak ada perbedaan dari MySQL. |
INT atau INTEGER |
— | -2147483648 hingga 2147483647 |
4 bytes | Sesuai dengan INT atau MEDIUMINT MySQL. |
BIGINT |
— | -9223372036854775808 hingga 9223372036854775807 |
8 bytes | Tidak ada perbedaan dari MySQL. |
FLOAT |
— | -3.402823466E+38 hingga -1.175494351E-38, 0, 1.175494351E-38 hingga 3.402823466E+38 |
4 bytes | Mengikuti standar IEEE. Tidak ada perbedaan dari MySQL. |
DOUBLE |
— | -1.7976931348623157E+308 hingga -2.2250738585072014E-308, 0, 2.2250738585072014E-308 hingga 1.7976931348623157E+308 |
8 bytes | Mengikuti standar IEEE. Tidak ada perbedaan dari MySQL. |
DECIMAL(m,d) atau NUMERIC |
— | m: presisi maksimum 1–38; d: skala desimal, harus ≤ m |
— |
MySQL mendukung presisi maksimum
|
Tipe string
| Type | Description | MySQL equivalent |
|---|---|---|
VARCHAR |
Hingga 16 MB. Spesifikasi panjang seperti VARCHAR(255) diterima demi kompatibilitas sintaksis — batas maksimum aktual ditentukan oleh ukuran data (hingga 16 MB), bukan angka yang dideklarasikan. Jangan mengandalkan panjang yang dideklarasikan untuk validasi. |
CHAR, VARCHAR, TEXT, MEDIUMTEXT, atau LONGTEXT |
BINARY |
Panjang karakter penyimpanan. | BINARY, VARBINARY, atau BLOB |
Tipe waktu
| Type | Value range | Format | Size | Notes |
|---|---|---|---|---|
DATE |
'0001-01-01' hingga '9999-12-31' |
YYYY-MM-DD |
4 bytes | MySQL mendukung 0000-00-00; AnalyticDB for MySQL memvalidasi nilai waktu dan mengonversi 0000-00-00 menjadi NULL. Gunakan tanggal aktual. |
TIME |
'00:00:00' hingga '23:59:59' |
HH:MM:SS |
8 bytes | MySQL mendukung presisi kustom; AnalyticDB for MySQL mendukung presisi tingkat milidetik (hingga tiga tempat desimal). |
DATETIME |
'0001-01-01 00:00:00.000' hingga '9999-12-31 23:59:59.999' |
YYYY-MM-DD HH:MM:SS |
8 bytes | Disimpan dalam UTC. Zona waktu tidak dapat diubah. MySQL mendukung 0000-00-00 dan presisi kustom; AnalyticDB for MySQL mengonversi 0000-00-00 menjadi NULL. |
TIMESTAMP |
'0100-01-01 00:00:00.000' hingga '9999-12-31 23:59:59.999' |
YYYY-MM-DD HH:MM:SS |
8 bytes | Secara default menggunakan zona waktu sistem; Anda dapat menentukan zona waktu berbeda per session. MySQL mendukung presisi kustom; AnalyticDB for MySQL mendukung presisi tingkat milidetik (hingga tiga tempat desimal). |
DATETIME selalu menggunakan UTC. Berbeda dengan TIMESTAMP, zona waktu untuk nilai DATETIME tidak dapat diubah per sesi.
Tipe spasial
| Type | Description | Notes |
|---|---|---|
POINT |
Koordinat geografis x dan y. | Tidak ada perbedaan dari MySQL. |
Konversi tipe implisit
AnalyticDB for MySQL melakukan konversi tipe implisit secara otomatis berdasarkan konteks saat Anda menjalankan kueri SQL. Aturan konversi berbeda antara proyeksi SELECT dan filter WHERE.
Konversi tipe implisit hanya berlaku untuk tipe data dasar. Tipe data kompleks tidak mendukung konversi tipe implisit. Untuk kasus di mana aturan default tidak memenuhi kebutuhan Anda, gunakan konversi tipe eksplisit.
Aturan konversi proyeksi
Saat kolom dalam pernyataan SELECT dibandingkan dengan konstanta, hasilnya secara implisit dikonversi ke tipe yang ditunjukkan dalam tabel berikut. Jika konversi tidak didukung, terjadi kesalahan.
| Column \ Constant | 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 | Not supported | DOUBLE | Not supported | Not supported | Not supported | Not supported |
| TINYINT | BIGINT | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | Not supported | Not supported | Not supported | Not supported |
| SMALLINT | BIGINT | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | Not supported | Not supported | Not supported | Not supported |
| 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 | Not supported | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DOUBLE | Not supported | Not supported | Not supported | Not supported |
| DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
| TIME | TIME | Not supported | Not supported | Not supported | BIGINT | BIGINT | Not supported | DOUBLE | TIME | BIGINT | BIGINT | DATETIME |
| DATE | DATE | Not supported | Not supported | Not supported | BIGINT | BIGINT | Not supported | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
| TIMESTAMP | TIMESTAMP | Not supported | Not supported | Not supported | BIGINT | BIGINT | Not supported | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
| DATETIME | DATETIME | Not supported | Not supported | Not supported | BIGINT | BIGINT | Not supported | DOUBLE | DATETIME | DATETIME | DATETIME | DATETIME |
Aturan konversi filter
Saat kolom dalam klausa WHERE dibandingkan dengan konstanta bertipe berbeda, tipe hasilnya dikonversi secara implisit. Ketidaksesuaian tipe dapat mencegah pushdown—optimasi yang mendorong kondisi filter ke lapisan penyimpanan untuk pemfilteran berbasis indeks. Jika pushdown gagal, database kembali ke pemindaian tabel penuh, yang secara signifikan menurunkan performa kueri.
Tabel berikut menunjukkan tipe hasil dan status pushdown untuk setiap pasangan tipe kolom–konstanta. ✓ = pushdown berhasil; ✗ = pushdown gagal (pemindaian tabel penuh).
| Column \ Constant | 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 ✗ | Not supported | REAL ✗ | DOUBLE ✗ | Not supported | Not supported | Not supported | Not supported |
| TINYINT | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | Not supported | Not supported | Not supported | Not supported |
| SMALLINT | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | Not supported | Not supported | Not supported | Not supported |
| 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 ✗ | Not supported | Not supported | Not supported | Not supported |
| REAL | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | DOUBLE ✗ | Not supported | Not supported | Not supported | Not supported |
| DOUBLE | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ |
| TIME | TIME ✓ | Not supported | Not supported | Not supported | BIGINT ✗ | BIGINT ✗ | Not supported | Not supported | DOUBLE ✗ | TIME ✓ | BIGINT ✗ | BIGINT ✗ | DATETIME ✗ |
| DATE | DATE ✓ | Not supported | Not supported | Not supported | BIGINT ✗ | BIGINT ✗ | Not supported | Not supported | DOUBLE ✗ | BIGINT ✗ | DATE ✓ | TIMESTAMP ✗ | DATETIME ✗ |
| TIMESTAMP | TIMESTAMP ✓ | Not supported | Not supported | Not supported | BIGINT ✗ | BIGINT ✗ | Not supported | Not supported | DOUBLE ✗ | TIMESTAMP ✓ | TIMESTAMP ✓ | TIMESTAMP ✓ | TIMESTAMP ✓ |
| DATETIME | DATETIME ✓ | Not supported | Not supported | Not supported | BIGINT ✗ | BIGINT ✗ | Not supported | Not supported | DOUBLE ✗ | DATETIME ✓ | DATETIME ✓ | DATETIME ✓ | DATETIME ✓ |
Optimasi konversi tipe paksa (ENFORCE_UNWRAP_CAST)
ENFORCE_UNWRAP_CAST mengontrol cara AnalyticDB for MySQL menangani konversi tipe implisit dalam kondisi filter. Saat diaktifkan, sistem mengonversi konstanta agar sesuai dengan tipe kolom, bukan sebaliknya—sehingga mempertahankan optimasi pushdown dan mencegah hasil tak terduga akibat pemotongan nilai.
Konfigurasi ENFORCE_UNWRAP_CAST
Tersedia dua metode konfigurasi:
-
Global — berlaku untuk semua kueri dalam kluster:
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true; -
Petunjuk kueri — berlaku untuk satu kueri tanpa memengaruhi kueri lain:
/*+ ENFORCE_UNWRAP_CAST=true */
Contoh
Kolom col dalam tabel test bertipe VARCHAR dan berisi nilai '1', '1a', dan 'abc'. Menjalankan kueri berikut menghasilkan keluaran berbeda tergantung pada apakah ENFORCE_UNWRAP_CAST diaktifkan:
SELECT col FROM test WHERE col = 1;
| Setting | Behavior | Matching rows | Pushdown |
|---|---|---|---|
ENFORCE_UNWRAP_CAST=false (default) |
Mengonversi kolom VARCHAR ke BIGINT. '1' dan '1a' keduanya dipotong menjadi 1 dan cocok. |
'1', '1a' |
Gagal — pemindaian tabel penuh |
ENFORCE_UNWRAP_CAST=true |
Mengonversi konstanta INTEGER 1 ke VARCHAR '1'. Hanya kecocokan string eksak yang memenuhi syarat. |
'1' saja |
Berhasil — pushdown lapisan penyimpanan |
Aktifkan ENFORCE_UNWRAP_CAST saat kolom dideklarasikan sebagai tipe string tetapi dikueri dengan konstanta numerik, untuk mendapatkan hasil akurat dan menghindari pemindaian tabel penuh.