---
title: "Chuyển MySQL sang Oracle trên trình duyệt"
description: "Di chuyển cơ sở dữ liệu MySQL hoặc MariaDB sang Oracle: chuyển bản dump thành tập lệnh cùng bảng, khóa và dữ liệu, kèm báo cáo mọi thay đổi."
canonical: https://intosql.com/vi/mysql-sang-oracle
last_updated: 2026-10-15
---

# Chuyển MySQL sang Oracle trên trình duyệt

Thả bản dump từ mysqldump, mariadb-dump, mysqlpump, phpMyAdmin hoặc Adminer, dạng .sql hoặc .sql.gz, và tải xuống tập lệnh Oracle với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị Oracle không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.

[Hướng dẫn di chuyển MySQL sang Oracle](https://intosql.com/docs/migrations/mysql-to-oracle)

[Kiểu dữ liệu từ MySQL sang Oracle](https://intosql.com/docs/types/mysql-to-oracle)

## Những gì thay đổi từ MySQL sang Oracle

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

| Trong MySQL | Trong Oracle | Dòng báo cáo |
| --- | --- | --- |
| TINYINT(1), BOOL | NUMBER(1) kèm CHECK 0 và 1 khi mọi giá trị là 0 hoặc 1, nếu không thì NUMBER(3) | `bool_kept_numeric` |
| UNSIGNED integers | NUMBER đủ rộng cho phạm vi, kèm CHECK không âm |  |
| ZEROFILL and display widths | bị bỏ | `zerofill_dropped` |
| FLOAT(M,D) | BINARY_FLOAT hoặc BINARY_DOUBLE, bỏ số chữ số thập phân cố định | `float_scale_dropped` |
| DECIMAL(p,s) | NUMBER(p,s) đến 38 chữ số; vượt quá thì VARCHAR2 | `decimal_as_text` |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) đến 63 bit, NUMBER(20) cho BIT(64) |  |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULL | `invalid_date_null` |
| NOT NULL columns with values that become NULL | bỏ NOT NULL | `not_null_relaxed` |
| empty strings and empty binary values | NULL | `empty_string_null` |
| DEFAULT '0000-00-00' | không có giá trị mặc định | `zero_date_default` |
| TIME | INTERVAL DAY TO SECOND, chứa được khoảng thời gian |  |
| YEAR | NUMBER(4) kèm CHECK phạm vi |  |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), đếm theo ký tự |  |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOB | `text_as_lob` |
| DATETIME | TIMESTAMP |  |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE theo múi giờ bản dump nêu, UTC khi không nêu | `timestamp_zone_assumed` |
| ENUM | VARCHAR2 kèm CHECK các giá trị |  |
| ENUM holding '' (MySQL's error value) | NULL |  |
| ENUM holding values outside its list | không có CHECK | `enum_check_skipped` |
| SET | VARCHAR2 như MySQL ghi ('a,b') |  |
| JSON | CLOB |  |
| NUL bytes in text | được giữ |  |
| text that isn't valid in its character set | byte lỗi thành ký tự thay thế | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | sao chép nguyên trạng | `mojibake_suspected` |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, khởi động lại sau các id đã sao chép |  |
| MyISAM AUTO_INCREMENT on the second column of a key | một bộ đếm cho cả bảng | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | một trình kích hoạt BEFORE UPDATE | `on_update_trigger` |
| generated columns | cột ảo | `stored_as_virtual` |
| generated columns with functions Oracle lacks | một cột thường | `generated_not_translated` |
| INVISIBLE columns | cột INVISIBLE |  |
| CHECK constraints | được chuyển đổi, viết trực tiếp trong CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | không được tạo | `check_skipped` |
| CHECK ... NOT ENFORCED | không được tạo | `check_not_enforced` |
| defaults with functions Oracle lacks | không có giá trị mặc định | `default_not_translated` |
| keys and indexes on a prefix, c(20) | chỉ mục trên SUBSTR của cột | `prefix_unique` |
| FULLTEXT indexes | không được tạo | `fulltext_not_created` |
| SPATIAL indexes | không được tạo | `spatial_index_not_created` |
| functional indexes, and indexes on whole CLOB or BLOB columns | không được tạo | `index_skipped` |
| foreign keys | sau dữ liệu với ENABLE NOVALIDATE, rồi xác thực kèm cảnh báo về hàng mồ côi |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | bị bỏ | `foreign_key_action_unsupported` |
| foreign keys to columns without a unique key | không được tạo | `foreign_key_skipped` |
| table and column names | chữ hoa khi là tên thông thường, nếu không thì như đã viết | `identifier_renamed` |
| names over 128 bytes | rút ngắn | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | BLOB chứa WKB | `geometry_as_blob` |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36) |  |
| BINARY, VARBINARY, BLOB | RAW đến 2000 byte, nếu không thì BLOB |  |
| PARTITION BY | một bảng | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | bảng chứa các hàng hiện tại | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | bảng thường | `engine_dropped` |
| views, triggers, procedures, functions and events | được liệt kê trong báo cáo | `not_converted_objects` |
| dumps without CREATE TABLE | kiểu suy ra từ giá trị | `no_schema` |
| geometries in a dump without CREATE TABLE | BLOB chứa WKB | `geometry_inferred` |
| _ci collations | so sánh chính xác | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | được chuyển đổi, kèm cảnh báo | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | đọc dưới dạng Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | đọc dưới dạng UTF-8, kèm cảnh báo | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | được tính ra giá trị |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | giá trị mặc định của cột | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | hàng thường | `replace_as_insert` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| dumps of several databases | một schema, mỗi bảng có tên cơ sở dữ liệu ở đầu | `databases_merged` |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, tại giá trị nó đã đạt tới |  |
| VECTOR(n) (MariaDB 11.7+) | CLOB với các số thực dưới dạng mảng JSON | `type_replaced` |

## Nạp tập lệnh vào Oracle

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mysql.oracle.sql
```

Khóa ngoại được thêm với ENABLE NOVALIDATE, nên hàng mới được kiểm tra ngay, rồi được xác thực. Nếu một hàng cũ trỏ tới hàng không tồn tại, tập lệnh cho biết ràng buộc nào và để nó ở trạng thái chưa xác thực, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy chạy SQL*Plus trên cùng máy với cơ sở dữ liệu. Tập lệnh commit sau mỗi 100 hàng. Người dùng chạy tập lệnh cần quyền CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER và CREATE PROCEDURE, cùng hạn mức trên tablespace của mình.

## Tạo bản dump MySQL để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

- --default-character-set=utf8mb4 giữ emoji và các ký tự 4 byte khác, những ký tự mà bản dump utf8 làm mất trước khi trình chuyển đổi thấy.
- --hex-blob ghi cột nhị phân dưới dạng thập lục phân, không bị hỏng khi sao chép giữa các hệ thống.
- --routines --triggers --events thêm các đối tượng đó vào bản dump, để báo cáo có thể liệt kê chúng.

## Những gì không được chuyển đổi

Khung nhìn, trình kích hoạt, thủ tục lưu trữ, hàm và sự kiện được viết bằng ngôn ngữ riêng của từng cơ sở dữ liệu. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho Oracle.

## Câu hỏi về MySQL sang Oracle

### Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

### Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

### Nó có đọc được bản dump MariaDB không?

Có. Bản dump từ mariadb-dump và từ MariaDB 10.3 đến 12 được chuyển đổi theo cùng cách, kể cả các cột INET6, INET4 và UUID của MariaDB.

### Ngày 0000-00-00 sẽ ra sao?

Oracle không có ngày bằng 0, nên chúng trở thành NULL và cột chấp nhận NULL. Báo cáo cho biết số lượng trong mỗi cột. Chuỗi rỗng cũng thành NULL, vì Oracle lưu chúng như vậy.

### Giá trị AUTO_INCREMENT có được giữ không?

Có. Mỗi cột AUTO_INCREMENT trở thành cột identity, mọi hàng giữ id của nó, và id tiếp theo tiếp tục sau id lớn nhất, hoặc sau AUTO_INCREMENT của bảng nếu giá trị đó lớn hơn.

### TINYINT(1) có thành boolean không?

Oracle trước 23ai không có cột boolean. Cột có mọi giá trị là 0 hoặc 1 trở thành NUMBER(1) kèm ràng buộc kiểm tra giữ nguyên điều đó; cột chứa số khác giữ các số đó, và báo cáo giải thích lý do.

### Còn thủ tục lưu trữ và trình kích hoạt thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng. ON UPDATE CURRENT_TIMESTAMP là ngoại lệ: nó trở thành một trình kích hoạt Oracle.

### Tập lệnh nạp được trên những phiên bản Oracle nào?

Oracle 19c trở lên. Mọi bản dump thử nghiệm đều nạp được trên 21c và 23ai, và dừng ở lỗi đầu tiên nếu có sự cố.

## Từ MySQL

- [MySQL sang PostgreSQL](https://intosql.com/vi/mysql-sang-postgresql)
- [MySQL sang MySQL](https://intosql.com/vi/mysql-sang-mysql)
- [MySQL sang MariaDB](https://intosql.com/vi/mysql-sang-mariadb)
- [MySQL sang SQLite](https://intosql.com/vi/mysql-sang-sqlite)
- [MySQL sang SQL Server](https://intosql.com/vi/mysql-sang-sql-server)

## Sang Oracle

- [MariaDB sang Oracle](https://intosql.com/vi/mariadb-sang-oracle)
- [PostgreSQL sang Oracle](https://intosql.com/vi/postgresql-sang-oracle)
- [SQL Server sang Oracle](https://intosql.com/vi/sql-server-sang-oracle)
- [SQLite sang Oracle](https://intosql.com/vi/sqlite-sang-oracle)
- [Oracle sang Oracle](https://intosql.com/vi/oracle-sang-oracle)

## Hướng dẫn và mọi cặp

- [Oracle sang MySQL](https://intosql.com/vi/oracle-sang-mysql)
- [Hướng dẫn di chuyển MySQL sang Oracle](https://intosql.com/docs/migrations/mysql-to-oracle)
- [Kiểu dữ liệu từ MySQL sang Oracle](https://intosql.com/docs/types/mysql-to-oracle)
- [Mọi cặp cơ sở dữ liệu](https://intosql.com/vi/chuyen-co-so-du-lieu)
