Chuyển MariaDB sang Oracle
Thả bản dump từ mariadb-dump, mysqldump, 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.
Đã chuyển đổi 18 hàng, 4 bản sửa, không hàng nào bị từ chối
Các bảng trong shop_2024_mariadb.sqlBản dump MariaDB 11.8.9-MariaDB-ubu2404 · do mariadb-dump ghi · utf8mb4
customersghi thành CUSTOMERS8 hàng2
8 cột ID NUMBER(10) not null NAME VARCHAR2(100 CHAR) not null EMAIL VARCHAR2(150 CHAR) not null COUNTRY VARCHAR2(2 CHAR) not null IS_ACTIVE NUMBER(1) not null SIGNED_UP DATE CREATED_AT TIMESTAMP(0) WITH TIME ZONE not null LAST_IP VARCHAR2(39 CHAR) ordersghi thành ORDERS10 hàng2
12 cột ID NUMBER(10) not null CUSTOMER_ID NUMBER(10) not null STATUS VARCHAR2(9 CHAR) TOTAL NUMBER(10,2) not null ITEMS NUMBER(5) not null ORDERED_AT TIMESTAMP(0) not null SHIPPED_AT TIMESTAMP(0) NOTE VARCHAR2(255 CHAR) ORDER_REF VARCHAR2(36 CHAR) not null INVOICE NUMBER(10) not null DETAILS CLOB UPDATED_AT TIMESTAMP(0) WITH TIME ZONE not null
-- Written by IntoSQL from a MySQL dump. Load it with: NLS_LANG=.AL32UTF8 sqlplus -S -L <user>/<password>@<database> @<file>
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
SET DEFINE OFF;
SET SQLBLANKLINES ON;
SET FEEDBACK OFF;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION "INTOSQL_CLOB" (p SYS.ODCIVARCHAR2LIST) RETURN CLOB IS
r CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(r, TRUE);
FOR i IN 1 .. p.COUNT LOOP
IF p(i) IS NOT NULL THEN
DBMS_LOB.WRITEAPPEND(r, LENGTH2(p(i)), p(i));
END IF;
END LOOP;
RETURN r;
END;
/
CREATE OR REPLACE FUNCTION "INTOSQL_BLOB" (p SYS.ODCIVARCHAR2LIST) RETURN BLOB IS
r BLOB;
piece RAW(2000);
BEGIN
DBMS_LOB.CREATETEMPORARY(r, TRUE);
FOR i IN 1 .. p.COUNT LOOP
piece := HEXTORAW(p(i));
DBMS_LOB.WRITEAPPEND(r, UTL_RAW.LENGTH(piece), piece);
END LOOP;
RETURN r;
END;
/
CREATE SEQUENCE "INVOICE_NUMBERS" START WITH 2000 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775806;
CREATE TABLE "CUSTOMERS" (
"ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1001),
"NAME" VARCHAR2(100 CHAR) NOT NULL,
"EMAIL" VARCHAR2(150 CHAR) NOT NULL,
"COUNTRY" VARCHAR2(2 CHAR) DEFAULT 'US' NOT NULL,
"IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
"SIGNED_UP" DATE,
"CREATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
"LAST_IP" VARCHAR2(39 CHAR),
CONSTRAINT "CK_CUSTOMERS_ID" CHECK ("ID" >= 0),
CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1))
);
CREATE TABLE "ORDERS" (
"ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 5001),
"CUSTOMER_ID" NUMBER(10) NOT NULL,
"STATUS" VARCHAR2(9 CHAR) DEFAULT 'pending',
"TOTAL" NUMBER(10,2) NOT NULL,
"ITEMS" NUMBER(5) DEFAULT 1 NOT NULL,
"ORDERED_AT" TIMESTAMP(0) NOT NULL,
"SHIPPED_AT" TIMESTAMP(0),
"NOTE" VARCHAR2(255 CHAR),
"ORDER_REF" VARCHAR2(36 CHAR) NOT NULL,
"INVOICE" NUMBER(10) DEFAULT ("INVOICE_NUMBERS".NEXTVAL) NOT NULL,
"DETAILS" CLOB,
"UPDATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
CONSTRAINT "CK_ORDERS_ID" CHECK ("ID" >= 0),
CONSTRAINT "CK_ORDERS_CUSTOMER_ID" CHECK ("CUSTOMER_ID" >= 0),
CONSTRAINT "CK_ORDERS_STATUS" CHECK ("STATUS" IN ('pending', 'paid', 'shipped', 'cancelled')),
CONSTRAINT "CK_ORDERS_ITEMS" CHECK ("ITEMS" >= 0)
);
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00 +00:00',
'::ffff:203.0.113.7'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42 +00:00',
'2001:db8::1'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17 +00:00',
NULL
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00 +00:00',
'::ffff:198.51.100.23'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 14:00:00 +00:00',
NULL
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00 +00:00',
'2001:db8:85a3::8a2e:370:7334'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59 +00:00',
'::ffff:192.0.2.200'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12 +00:00',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
1,
1,
'shipped',
129.90,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',
1000,
'{"gift": false}',
TIMESTAMP '2024-03-02 16:30:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
2,
2,
'paid',
54.00,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',
1001,
'{"gift": true, "wrap": "red"}',
TIMESTAMP '2024-03-02 11:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
3,
1,
'cancelled',
12.50,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',
1002,
NULL,
TIMESTAMP '2024-03-03 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
4,
4,
'shipped',
980.00,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',
1003,
'{"fragile": true}',
TIMESTAMP '2024-03-07 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice',
'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',
1004,
NULL,
TIMESTAMP '2024-03-08 17:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
6,
6,
'shipped',
310.40,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"',
'50f2917d-8e6c-4d3f-8baa-6f708192a3b4',
1005,
'{"fragile": true}',
TIMESTAMP '2024-03-11 09:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
7,
8,
'paid',
76.20,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',
1006,
NULL,
TIMESTAMP '2024-03-11 18:46:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
8,
2,
NULL,
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Status lost in an old import',
'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',
1007,
NULL,
TIMESTAMP '2024-03-12 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
9,
3,
'shipped',
64.00,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded',
'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',
1008,
'{"parcels": [1, 2]}',
TIMESTAMP '2024-03-15 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
10,
7,
'paid',
1499.00,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',
1009,
NULL,
TIMESTAMP '2024-03-15 21:05:00 +00:00'
);
COMMIT;
END;
/
-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_UQ_EMAIL" UNIQUE ("EMAIL");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_IDX_CUSTOMER" ON "ORDERS" ("CUSTOMER_ID");
CREATE INDEX "IX_ORDERS_IDX_STATUS_DATE" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "FK_ORDERS_CUSTOMER" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "FK_ORDERS_CUSTOMER"';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"FK_ORDERS_CUSTOMER"' || ' has rows without a parent: it stays unvalidated, and new rows are checked.');
END;
/
DECLARE
next_id NUMBER;
BEGIN
SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "CUSTOMERS";
IF next_id < 1001 THEN
next_id := 1001;
END IF;
EXECUTE IMMEDIATE 'ALTER TABLE "CUSTOMERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
COMMENT ON TABLE "CUSTOMERS" IS 'People who bought at least once';
DECLARE
next_id NUMBER;
BEGIN
SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "ORDERS";
IF next_id < 5001 THEN
next_id := 5001;
END IF;
EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
CREATE OR REPLACE TRIGGER "TR_ORDERS_UPDATED_AT" BEFORE UPDATE ON "ORDERS" FOR EACH ROW
BEGIN
IF NOT UPDATING('UPDATED_AT') THEN
:NEW."UPDATED_AT" := SYSTIMESTAMP;
END IF;
END;
/
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;
Bản sửa
- "signed_up" của customers giờ cho phép NULL: một số giá trị không lưu được và là NULL.
- Giá trị mặc định của "signed_up" trong customers, 0000‑00‑00, không phải ngày Oracle chấp nhận, nên cột không có giá trị mặc định.
- "status" của orders giờ cho phép NULL: một số giá trị không lưu được và là NULL.
- "updated_at" của orders đổi thành thời điểm hiện tại mỗi lần cập nhật; trong Oracle, một trình kích hoạt làm việc đó.
Cần xem lại
- 1 giá trị trong "signed_up" của customers là ngày bằng 0 hoặc không hợp lệ, như 0000‑00‑00, mà Oracle không lưu được, nên được đặt thành NULL. Nếu các ngày đó có ý nghĩa, hãy thay chúng bằng ngày thật trong nguồn trước khi tạo bản dump.
- 1 giá trị trong "shipped_at" của orders là ngày bằng 0 hoặc không hợp lệ, như 0000‑00‑00 00:00:00, mà Oracle không lưu được, nên được đặt thành NULL. Nếu các ngày đó có ý nghĩa, hãy thay chúng bằng ngày thật trong nguồn trước khi tạo bản dump.
- 1 giá trị rỗng trong "status" của orders đã thành NULL; Oracle lưu chuỗi rỗng dưới dạng NULL. Ở chỗ truy vấn so sánh cột này với ', hãy dùng IS NULL thay thế.
Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.
Mẫu khác:
Những gì thay đổi từ MariaDB 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.
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 của MySQL là TINYINT(1), chứa được mọi số từ -128 đến 127. Oracle trước 23ai không có cột boolean, nên cột chỉ gồm 0 và 1 là NUMBER(1) kèm ràng buộc kiểm tra; cột chứa 2 hoặc -1 giữ các số của nó.
Dòng báo cáo: bool_kept_numeric
UNSIGNED integers
NUMBER đủ rộng cho phạm vi, kèm CHECK không âm
NUMBER của Oracle chứa được mọi số nguyên thuộc các độ rộng MySQL có; ràng buộc kiểm tra chặn giá trị âm như MySQL.
ZEROFILL and display widths
bị bỏ
Thêm số 0 phía trước là cách hiển thị số, không phải một phần của số. Các số được giữ; hãy định dạng khi đọc nếu cần phần số 0 đó.
Dòng báo cáo: zerofill_dropped
FLOAT(M,D)
BINARY_FLOAT hoặc BINARY_DOUBLE, bỏ số chữ số thập phân cố định
Số dấu phẩy động nhị phân của Oracle không có số chữ số thập phân cố định. Giá trị đã lưu được sao chép nguyên trạng.
Dòng báo cáo: float_scale_dropped
DECIMAL(p,s)
NUMBER(p,s) đến 38 chữ số; vượt quá thì VARCHAR2
NUMBER của Oracle chứa 38 chữ số. Số thập phân rộng hơn được giữ dạng văn bản để mọi chữ số đều chính xác.
Dòng báo cáo: decimal_as_text
BIT(1), BIT(n)
NUMBER(1), NUMBER(19) đến 63 bit, NUMBER(20) cho BIT(64)
Trường bit được lưu thành số do các bit của nó tạo nên.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
Oracle chỉ lưu ngày có thật trên lịch. MySQL giữ ngày bằng 0 và ngày không hợp lệ khi chế độ SQL cho phép; chúng trở thành NULL và báo cáo đếm số lượng.
Dòng báo cáo: invalid_date_null
NOT NULL columns with values that become NULL
bỏ NOT NULL
Cột có giá trị phải chuyển thành NULL, kể cả chuỗi rỗng, không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.
Dòng báo cáo: not_null_relaxed
empty strings and empty binary values
NULL
Oracle lưu chuỗi rỗng dưới dạng NULL, nên giá trị từng là ' sẽ được đọc lại là NULL. Báo cáo đếm chúng theo từng cột.
Dòng báo cáo: empty_string_null
DEFAULT '0000-00-00'
không có giá trị mặc định
Giá trị mặc định mà Oracle không lưu được sẽ bị bỏ, thay vì thay bằng một ngày bịa ra.
Dòng báo cáo: zero_date_default
TIME
INTERVAL DAY TO SECOND, chứa được khoảng thời gian
Oracle không có kiểu giờ trong ngày, và TIME của MySQL là khoảng thời gian từ -838:59:59 đến 838:59:59; interval chứa được mọi giá trị.
YEAR
NUMBER(4) kèm CHECK phạm vi
Oracle không có kiểu năm; ràng buộc kiểm tra giữ đúng các giá trị MySQL cho phép.
CHAR(n), VARCHAR(n)
VARCHAR2(n CHAR), đếm theo ký tự
Độ dài được đếm theo ký tự như MySQL, và MySQL trả về giá trị CHAR không có khoảng trắng cuối, đúng như VARCHAR2 giữ chúng.
VARCHAR(n) and TEXT longer than 4000 bytes
CLOB
VARCHAR2 mặc định chứa 4000 byte, nên văn bản dài hơn là CLOB; cột có mọi giá trị vừa thì giữ VARCHAR2.
Dòng báo cáo: text_as_lob
DATETIME
TIMESTAMP
DATETIME là thời gian theo đồng hồ, không kèm múi giờ, giống TIMESTAMP. DATE trở thành DATE của Oracle, kiểu này cũng chứa giờ trong ngày, luôn là nửa đêm.
TIMESTAMP
TIMESTAMP WITH TIME ZONE theo múi giờ bản dump nêu, UTC khi không nêu
TIMESTAMP là một thời điểm. Bản dump nêu múi giờ đã dùng khi ghi (mysqldump ghi UTC); nếu không, giá trị được đọc theo UTC và báo cáo ghi rõ điều đó.
Dòng báo cáo: timestamp_zone_assumed
ENUM
VARCHAR2 kèm CHECK các giá trị
Văn bản kèm ràng buộc kiểm tra giữ đúng các giá trị.
ENUM holding '' (MySQL's error value)
NULL
MySQL lưu chuỗi rỗng khi một giá trị không hợp lệ được ghi vào ENUM ở chế độ SQL không nghiêm ngặt. Oracle lưu nó dưới dạng NULL, ràng buộc kiểm tra cho phép, và báo cáo đếm nó cùng các giá trị rỗng khác.
ENUM holding values outside its list
không có CHECK
Giá trị không có trong danh sách sẽ vi phạm ràng buộc kiểm tra, nên ràng buộc không được tạo.
Dòng báo cáo: enum_check_skipped
SET
VARCHAR2 như MySQL ghi ('a,b')
Oracle không có kiểu tập hợp; văn bản là chuỗi MySQL trả về.
JSON
CLOB
Hàm JSON của Oracle đọc JSON từ văn bản trên mọi phiên bản, và CLOB giữ được giá trị ở mọi kích thước.
NUL bytes in text
được giữ
VARCHAR2 và CLOB chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.
text that isn't valid in its character set
byte lỗi thành ký tự thay thế
Văn bản phải được đọc thành ký tự thì mới ghi được dưới dạng VARCHAR2.
Dòng báo cáo: invalid_utf8_replaced
text decoded twice (ñ)
sao chép nguyên trạng
Bản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.
Dòng báo cáo: mojibake_suspected
AUTO_INCREMENT
GENERATED BY DEFAULT ON NULL AS IDENTITY, khởi động lại sau các id đã sao chép
Các id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất hoặc AUTO_INCREMENT của bản dump, tùy giá trị nào lớn hơn.
MyISAM AUTO_INCREMENT on the second column of a key
một bộ đếm cho cả bảng
MyISAM đếm theo nhóm của cột đầu tiên trong khóa; Oracle có một bộ đếm cho mỗi bảng.
Dòng báo cáo: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
một trình kích hoạt BEFORE UPDATE
Trình kích hoạt đặt cột thành thời điểm hiện tại khi lệnh cập nhật không đặt nó.
Dòng báo cáo: on_update_trigger
generated columns
cột ảo
Oracle chỉ tính cột tính toán khi đọc; cột STORED trở thành cột ảo với cùng giá trị.
Dòng báo cáo: stored_as_virtual
generated columns with functions Oracle lacks
một cột thường
Công thức không viết được cho Oracle để lại một cột thường và một dòng trong báo cáo.
Dòng báo cáo: generated_not_translated
INVISIBLE columns
cột INVISIBLE
Oracle ẩn cột ẩn khỏi SELECT * như MySQL.
CHECK constraints
được chuyển đổi, viết trực tiếp trong CREATE TABLE
Ràng buộc kiểm tra viết trực tiếp được kiểm tra khi từng hàng được nạp.
CHECK constraints with functions Oracle lacks
không được tạo
Ràng buộc kiểm tra không viết được cho Oracle sẽ bị bỏ và được báo cáo.
Dòng báo cáo: check_skipped
CHECK ... NOT ENFORCED
không được tạo
MySQL giữ các ràng buộc kiểm tra này nhưng không áp dụng, nên các hàng có thể vi phạm chúng.
Dòng báo cáo: check_not_enforced
defaults with functions Oracle lacks
không có giá trị mặc định
Giá trị mặc định không viết được cho Oracle sẽ bị bỏ và được báo cáo.
Dòng báo cáo: default_not_translated
keys and indexes on a prefix, c(20)
chỉ mục trên SUBSTR của cột
Chỉ mục hàm trên cùng phần đầu của cột giữ các hàng không trùng nhau như cũ, và lập chỉ mục được cột CLOB mà Oracle không lập chỉ mục toàn bộ được.
Dòng báo cáo: prefix_unique
FULLTEXT indexes
không được tạo
Oracle Text xây dựng tìm kiếm toàn văn với kiểu chỉ mục và truy vấn riêng.
Dòng báo cáo: fulltext_not_created
SPATIAL indexes
không được tạo
Dữ liệu hình học được lưu dưới dạng byte WKB, mà chỉ mục không gian không đọc được.
Dòng báo cáo: spatial_index_not_created
functional indexes, and indexes on whole CLOB or BLOB columns
không được tạo
Oracle không lập chỉ mục toàn bộ một đối tượng lớn được, và một số hàm MySQL không có hàm tương đương trong Oracle.
Dòng báo cá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
Bản dump nạp với FOREIGN_KEY_CHECKS=0 và MyISAM không bao giờ kiểm tra, nên hàng không có hàng cha là chuyện thường. Khóa kiểm tra hàng mới ngay và được xác thực sau cùng; hàng mồ côi khiến khóa ở trạng thái chưa xác thực kèm cảnh báo thay vì dừng quá trình nạp.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT
bị bỏ
Khóa ngoại của Oracle chỉ hành động khi xóa, với CASCADE hoặc SET NULL.
Dòng báo cáo: foreign_key_action_unsupported
foreign keys to columns without a unique key
không được tạo
Oracle cần khóa chính hoặc ràng buộc duy nhất trên các cột được tham chiếu; InnoDB thì không.
Dòng báo cá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
Oracle lưu tên viết không có dấu ngoặc kép bằng chữ hoa, nên tên thông thường thành chữ hoa và truy vấn có thể bỏ dấu ngoặc kép; các tên khác giữ hoa thường và cần dấu ngoặc kép.
Dòng báo cáo: identifier_renamed
names over 128 bytes
rút ngắn
Tên trong Oracle 12.2 trở lên tối đa 128 byte.
Dòng báo cáo: name_shortened
GEOMETRY, POINT, POLYGON...
BLOB chứa WKB
WKB là dạng chuẩn mà mọi thư viện không gian đều đọc được; SDO_GEOMETRY cần metadata của Oracle Spatial.
Dòng báo cáo: geometry_as_blob
INET4, INET6, UUID (MariaDB)
VARCHAR2(39), VARCHAR2(36)
Oracle không có kiểu nào trong hai kiểu này; văn bản là chuỗi MariaDB trả về.
BINARY, VARBINARY, BLOB
RAW đến 2000 byte, nếu không thì BLOB
Byte vẫn là byte.
PARTITION BY
một bảng
Các hàng giữ nguyên; hãy phân vùng lại bảng trong Oracle nếu cần.
Dòng báo cáo: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
bảng chứa các hàng hiện tại
Bản dump chỉ chứa các hàng hiện tại.
Dòng báo cáo: system_versioning_dropped
MyISAM, MEMORY and other engines
bảng thường
Oracle có một engine bảng duy nhất.
Dòng báo cáo: engine_dropped
views, triggers, procedures, functions and events
được liệt kê trong báo cáo
Mã của chúng viết bằng ngôn ngữ của MySQL, nên được liệt kê để bạn tạo lại.
Dòng báo cáo: not_converted_objects
dumps without CREATE TABLE
kiểu suy ra từ giá trị
Bản dump tạo với --no-create-info chỉ có các hàng, nên kiểu được suy ra từ giá trị.
Dòng báo cáo: no_schema
geometries in a dump without CREATE TABLE
BLOB chứa WKB
Định dạng hình học của MySQL được nhận diện từ giá trị và lưu dưới dạng WKB chuẩn.
Dòng báo cáo: geometry_inferred
_ci collations
so sánh chính xác
Oracle so sánh văn bản chính xác, trừ khi được chỉ định khác.
Dòng báo cáo: case_insensitive_collation
SET NAMES utf8 from utf8mb4 tables
được chuyển đổi, kèm cảnh báo
mysqldump của MySQL 5.x mặc định ghi utf8 3 byte và thay mọi emoji bằng dấu chấm hỏi trước khi bất kỳ trình chuyển đổi nào thấy tệp.
Dòng báo cá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)
latin1 của MySQL là Windows-1252, bảng mã thường gặp của những bản dump như vậy.
Dòng báo cáo: charset_guessed
sjis, cp932, gbk, big5 dumps
đọc dưới dạng UTF-8, kèm cảnh báo
Các bảng mã này chưa được giải mã.
Dòng báo cáo: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
được tính ra giá trị
Một số công cụ dump ghi giá trị dưới dạng các lệnh gọi này; chúng được đọc thành giá trị mà chúng tạo ra, với WKT địa lý được chuyển sang kinh độ trước.
other expressions in rows
NULL
Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.
Dòng báo cáo: expression_value
DEFAULT in VALUES
giá trị mặc định của cột
Giá trị mặc định dạng hằng được sao chép vào hàng.
Dòng báo cáo: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Không có giá trị nào để sao chép.
Dòng báo cáo: default_keyword_null
REPLACE and INSERT IGNORE
hàng thường
Bản dump có một hàng cho mỗi khóa, nên các hàng vẫn giống nhau.
Dòng báo cáo: replace_as_insert
types IntoSQL doesn't know
CLOB
Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.
Dòng báo cáo: unknown_type
values that don't fit their column
NULL
Bản dump bị hỏng hoặc viết tay có thể chứa giá trị mà cột không chứa được; chúng trở thành NULL để phần còn lại được nạp.
Dòng báo cáo: invalid_value_null
unreadable geometries
NULL
Byte không phải dữ liệu hình học thì không lưu được dưới dạng hình học.
Dòng báo cáo: bad_geometry
dumps of several databases
một schema, mỗi bảng có tên cơ sở dữ liệu ở đầu
Tập lệnh nạp vào schema của người dùng chạy nó, nên bảng từ các cơ sở dữ liệu khác nhau có tên cơ sở dữ liệu ở đầu.
Dòng báo cáo: databases_merged
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE, tại giá trị nó đã đạt tới
Sequence của Oracle hoạt động theo cùng cách.
VECTOR(n) (MariaDB 11.7+)
CLOB với các số thực dưới dạng mảng JSON
Chỉ Oracle 23ai có kiểu vector; mảng JSON giữ mọi số thực trên mọi phiên bản.
Dòng báo cáo: type_replaced
| Trong MariaDB | 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 của MySQL là TINYINT(1), chứa được mọi số từ -128 đến 127. Oracle trước 23ai không có cột boolean, nên cột chỉ gồm 0 và 1 là NUMBER(1) kèm ràng buộc kiểm tra; cột chứa 2 hoặc -1 giữ các số của nó. | bool_kept_numeric |
| UNSIGNED integers | NUMBER đủ rộng cho phạm vi, kèm CHECK không âmNUMBER của Oracle chứa được mọi số nguyên thuộc các độ rộng MySQL có; ràng buộc kiểm tra chặn giá trị âm như MySQL. | |
| ZEROFILL and display widths | bị bỏThêm số 0 phía trước là cách hiển thị số, không phải một phần của số. Các số được giữ; hãy định dạng khi đọc nếu cần phần số 0 đó. | zerofill_dropped |
| FLOAT(M,D) | BINARY_FLOAT hoặc BINARY_DOUBLE, bỏ số chữ số thập phân cố địnhSố dấu phẩy động nhị phân của Oracle không có số chữ số thập phân cố định. Giá trị đã lưu được sao chép nguyên trạng. | float_scale_dropped |
| DECIMAL(p,s) | NUMBER(p,s) đến 38 chữ số; vượt quá thì VARCHAR2NUMBER của Oracle chứa 38 chữ số. Số thập phân rộng hơn được giữ dạng văn bản để mọi chữ số đều chính xác. | decimal_as_text |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) đến 63 bit, NUMBER(20) cho BIT(64)Trường bit được lưu thành số do các bit của nó tạo nên. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLOracle chỉ lưu ngày có thật trên lịch. MySQL giữ ngày bằng 0 và ngày không hợp lệ khi chế độ SQL cho phép; chúng trở thành NULL và báo cáo đếm số lượng. | invalid_date_null |
| NOT NULL columns with values that become NULL | bỏ NOT NULLCột có giá trị phải chuyển thành NULL, kể cả chuỗi rỗng, không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng. | not_null_relaxed |
| empty strings and empty binary values | NULLOracle lưu chuỗi rỗng dưới dạng NULL, nên giá trị từng là ' sẽ được đọc lại là NULL. Báo cáo đếm chúng theo từng cột. | empty_string_null |
| DEFAULT '0000-00-00' | không có giá trị mặc địnhGiá trị mặc định mà Oracle không lưu được sẽ bị bỏ, thay vì thay bằng một ngày bịa ra. | zero_date_default |
| TIME | INTERVAL DAY TO SECOND, chứa được khoảng thời gianOracle không có kiểu giờ trong ngày, và TIME của MySQL là khoảng thời gian từ -838:59:59 đến 838:59:59; interval chứa được mọi giá trị. | |
| YEAR | NUMBER(4) kèm CHECK phạm viOracle không có kiểu năm; ràng buộc kiểm tra giữ đúng các giá trị MySQL cho phép. | |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), đếm theo ký tựĐộ dài được đếm theo ký tự như MySQL, và MySQL trả về giá trị CHAR không có khoảng trắng cuối, đúng như VARCHAR2 giữ chúng. | |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOBVARCHAR2 mặc định chứa 4000 byte, nên văn bản dài hơn là CLOB; cột có mọi giá trị vừa thì giữ VARCHAR2. | text_as_lob |
| DATETIME | TIMESTAMPDATETIME là thời gian theo đồng hồ, không kèm múi giờ, giống TIMESTAMP. DATE trở thành DATE của Oracle, kiểu này cũng chứa giờ trong ngày, luôn là nửa đêm. | |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE theo múi giờ bản dump nêu, UTC khi không nêuTIMESTAMP là một thời điểm. Bản dump nêu múi giờ đã dùng khi ghi (mysqldump ghi UTC); nếu không, giá trị được đọc theo UTC và báo cáo ghi rõ điều đó. | timestamp_zone_assumed |
| ENUM | VARCHAR2 kèm CHECK các giá trịVăn bản kèm ràng buộc kiểm tra giữ đúng các giá trị. | |
| ENUM holding '' (MySQL's error value) | NULLMySQL lưu chuỗi rỗng khi một giá trị không hợp lệ được ghi vào ENUM ở chế độ SQL không nghiêm ngặt. Oracle lưu nó dưới dạng NULL, ràng buộc kiểm tra cho phép, và báo cáo đếm nó cùng các giá trị rỗng khác. | |
| ENUM holding values outside its list | không có CHECKGiá trị không có trong danh sách sẽ vi phạm ràng buộc kiểm tra, nên ràng buộc không được tạo. | enum_check_skipped |
| SET | VARCHAR2 như MySQL ghi ('a,b')Oracle không có kiểu tập hợp; văn bản là chuỗi MySQL trả về. | |
| JSON | CLOBHàm JSON của Oracle đọc JSON từ văn bản trên mọi phiên bản, và CLOB giữ được giá trị ở mọi kích thước. | |
| NUL bytes in text | được giữVARCHAR2 và CLOB chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng. | |
| text that isn't valid in its character set | byte lỗi thành ký tự thay thếVăn bản phải được đọc thành ký tự thì mới ghi được dưới dạng VARCHAR2. | invalid_utf8_replaced |
| text decoded twice (ñ) | sao chép nguyên trạngBản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng. | mojibake_suspected |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, khởi động lại sau các id đã sao chépCác id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất hoặc AUTO_INCREMENT của bản dump, tùy giá trị nào lớn hơn. | |
| MyISAM AUTO_INCREMENT on the second column of a key | một bộ đếm cho cả bảngMyISAM đếm theo nhóm của cột đầu tiên trong khóa; Oracle có một bộ đếm cho mỗi bảng. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | một trình kích hoạt BEFORE UPDATETrình kích hoạt đặt cột thành thời điểm hiện tại khi lệnh cập nhật không đặt nó. | on_update_trigger |
| generated columns | cột ảoOracle chỉ tính cột tính toán khi đọc; cột STORED trở thành cột ảo với cùng giá trị. | stored_as_virtual |
| generated columns with functions Oracle lacks | một cột thườngCông thức không viết được cho Oracle để lại một cột thường và một dòng trong báo cáo. | generated_not_translated |
| INVISIBLE columns | cột INVISIBLEOracle ẩn cột ẩn khỏi SELECT * như MySQL. | |
| CHECK constraints | được chuyển đổi, viết trực tiếp trong CREATE TABLERàng buộc kiểm tra viết trực tiếp được kiểm tra khi từng hàng được nạp. | |
| CHECK constraints with functions Oracle lacks | không được tạoRàng buộc kiểm tra không viết được cho Oracle sẽ bị bỏ và được báo cáo. | check_skipped |
| CHECK ... NOT ENFORCED | không được tạoMySQL giữ các ràng buộc kiểm tra này nhưng không áp dụng, nên các hàng có thể vi phạm chúng. | check_not_enforced |
| defaults with functions Oracle lacks | không có giá trị mặc địnhGiá trị mặc định không viết được cho Oracle sẽ bị bỏ và được báo cáo. | default_not_translated |
| keys and indexes on a prefix, c(20) | chỉ mục trên SUBSTR của cộtChỉ mục hàm trên cùng phần đầu của cột giữ các hàng không trùng nhau như cũ, và lập chỉ mục được cột CLOB mà Oracle không lập chỉ mục toàn bộ được. | prefix_unique |
| FULLTEXT indexes | không được tạoOracle Text xây dựng tìm kiếm toàn văn với kiểu chỉ mục và truy vấn riêng. | fulltext_not_created |
| SPATIAL indexes | không được tạoDữ liệu hình học được lưu dưới dạng byte WKB, mà chỉ mục không gian không đọc được. | spatial_index_not_created |
| functional indexes, and indexes on whole CLOB or BLOB columns | không được tạoOracle không lập chỉ mục toàn bộ một đối tượng lớn được, và một số hàm MySQL không có hàm tương đương trong Oracle. | 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ôiBản dump nạp với FOREIGN_KEY_CHECKS=0 và MyISAM không bao giờ kiểm tra, nên hàng không có hàng cha là chuyện thường. Khóa kiểm tra hàng mới ngay và được xác thực sau cùng; hàng mồ côi khiến khóa ở trạng thái chưa xác thực kèm cảnh báo thay vì dừng quá trình nạp. | |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | bị bỏKhóa ngoại của Oracle chỉ hành động khi xóa, với CASCADE hoặc SET NULL. | foreign_key_action_unsupported |
| foreign keys to columns without a unique key | không được tạoOracle cần khóa chính hoặc ràng buộc duy nhất trên các cột được tham chiếu; InnoDB thì không. | foreign_key_skipped |
| table and column names | chữ hoa khi là tên thông thường, nếu không thì như đã viếtOracle lưu tên viết không có dấu ngoặc kép bằng chữ hoa, nên tên thông thường thành chữ hoa và truy vấn có thể bỏ dấu ngoặc kép; các tên khác giữ hoa thường và cần dấu ngoặc kép. | identifier_renamed |
| names over 128 bytes | rút ngắnTên trong Oracle 12.2 trở lên tối đa 128 byte. | name_shortened |
| GEOMETRY, POINT, POLYGON... | BLOB chứa WKBWKB là dạng chuẩn mà mọi thư viện không gian đều đọc được; SDO_GEOMETRY cần metadata của Oracle Spatial. | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36)Oracle không có kiểu nào trong hai kiểu này; văn bản là chuỗi MariaDB trả về. | |
| BINARY, VARBINARY, BLOB | RAW đến 2000 byte, nếu không thì BLOBByte vẫn là byte. | |
| PARTITION BY | một bảngCác hàng giữ nguyên; hãy phân vùng lại bảng trong Oracle nếu cần. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | bảng chứa các hàng hiện tạiBản dump chỉ chứa các hàng hiện tại. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | bảng thườngOracle có một engine bảng duy nhất. | engine_dropped |
| views, triggers, procedures, functions and events | được liệt kê trong báo cáoMã của chúng viết bằng ngôn ngữ của MySQL, nên được liệt kê để bạn tạo lại. | not_converted_objects |
| dumps without CREATE TABLE | kiểu suy ra từ giá trịBản dump tạo với --no-create-info chỉ có các hàng, nên kiểu được suy ra từ giá trị. | no_schema |
| geometries in a dump without CREATE TABLE | BLOB chứa WKBĐịnh dạng hình học của MySQL được nhận diện từ giá trị và lưu dưới dạng WKB chuẩn. | geometry_inferred |
| _ci collations | so sánh chính xácOracle so sánh văn bản chính xác, trừ khi được chỉ định khác. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | được chuyển đổi, kèm cảnh báomysqldump của MySQL 5.x mặc định ghi utf8 3 byte và thay mọi emoji bằng dấu chấm hỏi trước khi bất kỳ trình chuyển đổi nào thấy tệp. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | đọc dưới dạng Latin-1 (Windows-1252)latin1 của MySQL là Windows-1252, bảng mã thường gặp của những bản dump như vậy. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | đọc dưới dạng UTF-8, kèm cảnh báoCác bảng mã này chưa được giải mã. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | được tính ra giá trịMột số công cụ dump ghi giá trị dưới dạng các lệnh gọi này; chúng được đọc thành giá trị mà chúng tạo ra, với WKT địa lý được chuyển sang kinh độ trước. | |
| other expressions in rows | NULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng. | expression_value |
| DEFAULT in VALUES | giá trị mặc định của cộtGiá trị mặc định dạng hằng được sao chép vào hàng. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLKhông có giá trị nào để sao chép. | default_keyword_null |
| REPLACE and INSERT IGNORE | hàng thườngBản dump có một hàng cho mỗi khóa, nên các hàng vẫn giống nhau. | replace_as_insert |
| types IntoSQL doesn't know | CLOBVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp. | unknown_type |
| values that don't fit their column | NULLBản dump bị hỏng hoặc viết tay có thể chứa giá trị mà cột không chứa được; chúng trở thành NULL để phần còn lại được nạp. | invalid_value_null |
| unreadable geometries | NULLByte không phải dữ liệu hình học thì không lưu được dưới dạng hình học. | bad_geometry |
| dumps of several databases | một schema, mỗi bảng có tên cơ sở dữ liệu ở đầuTập lệnh nạp vào schema của người dùng chạy nó, nên bảng từ các cơ sở dữ liệu khác nhau có tên cơ sở dữ liệu ở đầu. | databases_merged |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, tại giá trị nó đã đạt tớiSequence của Oracle hoạt động theo cùng cách. | |
| VECTOR(n) (MariaDB 11.7+) | CLOB với các số thực dưới dạng mảng JSONChỉ Oracle 23ai có kiểu vector; mảng JSON giữ mọi số thực trên mọi phiên bản. | 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.
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mariadb.oracle.sqlKhó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 MariaDB để 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, vốn bị bản dump utf8mb3 làm mất trước khi trình chuyển đổi nhìn thấy.
- --hex-blob ghi cột nhị phân và giá trị VECTOR 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 MariaDB. 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ề MariaDB sang Oracle
Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ
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.
Bản dump có thể đến từ những phiên bản MariaDB nào?
Bản dump từ mariadb-dump và mysqldump trên MariaDB 10.3 đến 12, với một INSERT mỗi bảng hoặc một INSERT mỗi hàng. Mọi bản dump thử nghiệm đến từ MariaDB 10.11, 11.4 và 11.8 và được so với nguồn từng ô một.
Cột UUID, INET6, JSON và VECTOR có được giữ không?
Cột UUID và INET thành VARCHAR2, JSON thành CLOB, và VECTOR thành mảng JSON chứa các số thực của nó. Ngày bằng 0 thành NULL, chuỗi rỗng cũng vậy, vì Oracle lưu chúng như thế.
Giá trị AUTO_INCREMENT và sequence có được giữ không?
Có. Mỗi cột AUTO_INCREMENT trở thành cột identity tiếp tục sau id lớn nhất. Sequence thành sequence Oracle, và giá trị mặc định lấy từ một sequence tiếp tục lấy từ nó.
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.
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ố.