Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển MariaDB sang SQL Server

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 SQL Server với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị SQL Server 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.

Tệp của bạn
sqlshop_2024_mariadb.sqlTệp mẫu, 6,6 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, 10 bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_mariadb.sqlBản dump MariaDB 11.8.9-MariaDB-ubu2404 · do mariadb-dump ghi · utf8mb4

  • customers8 hàng4
    8 cột
    idbigint not null
    namenvarchar(200) not null
    emailnvarchar(150) not null
    countrynvarchar(2) not null
    is_activebit not null
    signed_update
    created_atdatetimeoffset(0) not null
    last_ipnvarchar(39)
  • orders10 hàng6
    12 cột
    idbigint not null
    customer_idbigint not null
    statusnvarchar(9) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(0)
    notenvarchar(510)
    order_refuniqueidentifier not null
    invoiceint not null
    detailsnvarchar(max)
    updated_atdatetimeoffset(0) not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO

CREATE SEQUENCE [dbo].[invoice_numbers] AS bigint START WITH 2000 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775806;
GO
CREATE TABLE [dbo].[customers] (
    [id] bigint IDENTITY(1001, 1) NOT NULL,
    [name] nvarchar(200) NOT NULL,
    [email] nvarchar(150) NOT NULL,
    [country] nvarchar(2) DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
    [last_ip] nvarchar(39) NULL,
    CONSTRAINT [CK_customers_id] CHECK ([id] >= 0),
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] bigint IDENTITY(5001, 1) NOT NULL,
    [customer_id] bigint NOT NULL,
    [status] nvarchar(9) DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] int DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(0) NOT NULL,
    [shipped_at] datetime2(0) NULL,
    [note] nvarchar(510) NULL,
    [order_ref] uniqueidentifier NOT NULL,
    [invoice] int DEFAULT (NEXT VALUE FOR [dbo].[invoice_numbers]) NOT NULL,
    [details] nvarchar(max) NULL,
    [updated_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() 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 (N'pending', N'paid', N'shipped', N'cancelled', N'')),
    CONSTRAINT [CK_orders_items] CHECK ([items] >= 0),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at], [last_ip]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00+00:00',N'::ffff:203.0.113.7'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42+00:00',N'2001:db8::1'),
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17+00:00',NULL),
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00+00:00',N'::ffff:198.51.100.23'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00+00:00',NULL),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00+00:00',N'2001:db8:85a3::8a2e:370:7334'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59+00:00',N'::ffff:192.0.2.200'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12+00:00',NULL);
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [order_ref], [invoice], [details], [updated_at]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,N'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,N'{"gift": false}','2024-03-02 16:30:00+00:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',N'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,N'{"gift": true, "wrap": "red"}','2024-03-02 11:20:00+00:00'),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',N'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'2024-03-03 10:00:00+00:00'),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',N'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,N'{"fragile": true}','2024-03-07 08:00:00+00:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice',N'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'2024-03-08 17:20:00+00:00'),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',N'50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,N'{"fragile": true}','2024-03-11 09:00:00+00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,N'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,NULL,'2024-03-11 18:46:00+00:00'),
(8,2,N'',19.99,1,'2024-03-12 08:00:00',NULL,N'Status lost in an old import',N'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'2024-03-12 08:00:00+00:00'),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded',N'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,N'{"parcels": [1, 2]}','2024-03-15 10:00:00+00:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',N'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'2024-03-15 21:05:00+00:00');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [uq_email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [fk_orders_customer] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [fk_orders_customer]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[fk_orders_customer]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
CREATE TRIGGER [dbo].[TR_orders_updated_at_on_update] ON [dbo].[orders] AFTER UPDATE AS
BEGIN
    SET NOCOUNT ON;
    IF NOT UPDATE([updated_at])
        UPDATE x SET [updated_at] = SYSDATETIMEOFFSET() FROM [dbo].[orders] AS x JOIN inserted AS i ON x.[id] = i.[id];
END;
GO
GO

Bản sửa

  1. "id" của customers là số không dấu, nên được chuyển thành bigint kèm ràng buộc kiểm tra không âm.
  2. "name" của customers chứa ký tự mà SQL Server đếm hai lần, như emoji, nên là nvarchar(200).
  3. "signed_up" của customers giờ cho phép NULL: một số giá trị không lưu được và là NULL.
  4. Giá trị mặc định của "signed_up" trong customers, 0000‑00‑00, không phải ngày SQL Server chấp nhận, nên cột không có giá trị mặc định.
  5. "customer_id" của orders là số không dấu, nên được chuyển thành bigint kèm ràng buộc kiểm tra không âm.
  6. "id" của orders là số không dấu, nên được chuyển thành bigint kèm ràng buộc kiểm tra không âm.
  7. "items" của orders là số không dấu, nên được chuyển thành int kèm ràng buộc kiểm tra không âm.
  8. "note" của orders chứa ký tự mà SQL Server đếm hai lần, như emoji, nên là nvarchar(510).
  9. 1 hàng của "status" trong orders chứa giá trị rỗng mà MySQL lưu cho mục không hợp lệ; ràng buộc kiểm tra giá trị cho phép giá trị này.
  10. "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 SQL Server, 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à SQL Server 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à SQL Server 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.

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 SQL Server

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

    bit khi mọi giá trị là 0 hoặc 1, nếu không thì smallint

    BOOL của MySQL là TINYINT(1), chứa được mọi số từ -128 đến 127. Cột chỉ chứa 0 và 1 trở thành bit; cột chứa 2 hoặc -1 vẫn là số để không giá trị nào đổi nghĩa.

    Dòng báo cáo: bool_kept_numeric

  • UNSIGNED integers

    TINYINT UNSIGNED là tinyint; các kiểu khác là số nguyên rộng hơn kế tiếp kèm CHECK không âm, BIGINT UNSIGNED là bigint khi mọi giá trị vừa, nếu không thì decimal(38,0)

    SQL Server không có số nguyên không dấu ngoài tinyint, từ 0 đến 255. Kiểu rộng hơn chứa được toàn bộ dải không dấu, và ràng buộc kiểm tra chặn giá trị âm như MySQL.

    Dòng báo cáo: unsigned_widened

  • 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)

    real hoặc float, bỏ số chữ số thập phân cố định

    Số dấu phẩy động của SQL Server 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)

    decimal(p,s) đến 38 chữ số; vượt quá thì nvarchar

    decimal của SQL Server 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)

    bit; bigint đến 63 bit; decimal(20,0) cho BIT(64)

    Một bit đơn là có hoặc không; trường bit rộng hơn đượ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

    SQL Server 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 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

  • DEFAULT '0000-00-00'

    không có giá trị mặc định

    Giá trị mặc định mà SQL Server 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

    time khi mọi giá trị nằm trong một ngày, nếu không thì nvarchar

    TIME của MySQL là khoảng thời gian từ -838:59:59 đến 838:59:59; time của SQL Server là giờ trong ngày. Cột có giá trị dài hơn hoặc âm giữ chúng dạng văn bản.

    Dòng báo cáo: time_as_interval

  • YEAR

    smallint kèm CHECK phạm vi

    SQL Server 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)

    nvarchar(n)

    nvarchar chứa mọi ký tự trên mọi phiên bản được hỗ trợ, và MySQL trả về giá trị CHAR không có khoảng trắng cuối, đúng như nvarchar giữ chúng.

  • text with characters past U+FFFF (emoji) in VARCHAR(n)

    nvarchar(2n), hoặc nvarchar(max) khi vượt 4000

    nvarchar đếm theo đơn vị UTF-16 và một emoji chiếm hai đơn vị, nên cột được cấp đủ chỗ cho mọi giá trị.

    Dòng báo cáo: text_length_widened

  • DATETIME

    datetime2

    DATETIME là thời gian theo đồng hồ, không kèm múi giờ, giống datetime2.

  • TIMESTAMP

    datetimeoffset 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

    nvarchar 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)

    giá trị rỗng được ràng buộc kiểm tra cho phép

    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. Các hàng đó được giữ và ràng buộc kiểm tra cho phép chúng.

    Dòng báo cáo: enum_invalid_value

  • 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

    nvarchar như MySQL ghi ('a,b')

    SQL Server không có mảng; văn bản là chuỗi MySQL trả về.

  • JSON

    nvarchar(max)

    Hàm JSON của SQL Server đọc JSON từ văn bản. Ràng buộc ISJSON sẽ từ chối giá trị vô hướng như 1 hoặc "x" trước SQL Server 2022, mà MySQL vẫn giữ.

  • NUL bytes in text

    được giữ

    nvarchar 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 nvarchar.

    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

    IDENTITY, bộ đếm đặt sau các id đã sao chép

    Các id đã sao chép được nạp với IDENTITY_INSERT, 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; SQL Server 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 AFTER 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ó. Nó nối theo khóa chính, nên bảng cần có khóa chính.

    Dòng báo cáo: on_update_trigger

  • ON UPDATE CURRENT_TIMESTAMP on a table without a primary key

    không được chuyển sang

    Trình kích hoạt tìm các hàng đã cập nhật theo khóa chính; không có khóa chính thì không tìm được.

    Dòng báo cáo: on_update_without_key

  • generated columns

    cột tính toán, PERSISTED khi nguồn lưu chúng

    SQL Server tính chúng theo cùng hai cách.

  • generated columns with functions SQL Server lacks

    một cột thường

    Công thức không viết được cho SQL Server để 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 thường

    SQL Server không có cột ẩn.

    Dòng báo cáo: invisible_column

  • 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 SQL Server lacks

    không được tạo

    Ràng buộc kiểm tra không viết được cho SQL Server 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 SQL Server lacks

    không có giá trị mặc định

    Giá trị mặc định không viết được cho SQL Server 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 toàn bộ cột

    SQL Server lập chỉ mục toàn bộ cột; khóa duy nhất trên tiền tố cũng duy nhất trên toàn bộ cột, nên mọi hàng đều nạp được.

    Dòng báo cáo: prefix_whole_column

  • FULLTEXT indexes

    không được tạo

    Tìm kiếm toàn văn của SQL Server cần một catalog và truy vấn riêng.

    Dòng báo cáo: fulltext_not_created

  • SPATIAL indexes

    không được tạo

    Chỉ mục không gian trên cột hình học cần một hộp giới hạn mà bản dump không nêu.

    Dòng báo cáo: spatial_index_not_created

  • functional indexes, and indexes on columns of unlimited length

    không được tạo

    SQL Server không lập chỉ mục trên biểu thức, cũng như trên cột nvarchar(max) và varbinary(max).

    Dòng báo cáo: index_skipped

  • foreign keys

    sau dữ liệu với WITH NOCHECK, rồi kiểm tra 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 được tạo trước và kiểm tra sau cùng; hàng mồ côi khiến khóa ở trạng thái chưa kiểm tra kèm cảnh báo thay vì dừng quá trình nạp.

  • ON DELETE or ON UPDATE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server từ chối các thao tác lan truyền có thể chạm tới một bảng hai lần; MySQL cho phép.

    Dòng báo cáo: foreign_key_action_dropped

  • foreign keys to columns without a unique key

    không được tạo

    SQL Server cần khóa chính hoặc chỉ mục duy nhất không có NULL 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

    như đã viết; đổi tên khi chỉ khác nhau về hoa thường

    Tên trong SQL Server không phân biệt hoa thường với collation thông thường.

    Dòng báo cáo: identifier_renamed

  • names over 116 characters

    rút ngắn

    Tên trong SQL Server tối đa 128 ký tự, một phần dành cho các số giúp tên không trùng nhau.

    Dòng báo cáo: name_shortened

  • GEOMETRY, POINT, POLYGON...

    geometry, kèm SRID của từng giá trị

    Kiểu geometry riêng của SQL Server giữ mọi hình và hệ quy chiếu không gian của nó.

  • INET4, INET6, UUID (MariaDB)

    nvarchar(39), uniqueidentifier

    uniqueidentifier là UUID của SQL Server; địa chỉ được giữ dạng văn bản.

  • BINARY, VARBINARY, BLOB

    binary, varbinary, varbinary(max)

    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 SQL Server 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

    SQL Server 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

    geometry

    Định dạng hình học của MySQL được nhận diện từ giá trị.

  • _ci collations

    collation của cơ sở dữ liệu, thường không phân biệt hoa thường

    SQL Server so sánh văn bản không phân biệt hoa thường với collation thông thường, như _ci của MySQL.

  • 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

    nvarchar(max)

    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

  • CREATE SEQUENCE (MariaDB)

    CREATE SEQUENCE ... AS bigint, kèm giá trị tiếp theo

    SQL Server có sequence với cùng các tùy chọn; mỗi sequence tiếp tục từ chỗ bản dump dừng lại.

  • VECTOR(n) (MariaDB 11.7+)

    nvarchar(max) với các số thực dưới dạng mảng JSON

    Chỉ SQL Server 2025 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 MariaDBTrong SQL ServerDòng báo cáo
TINYINT(1), BOOLbit khi mọi giá trị là 0 hoặc 1, nếu không thì smallintBOOL của MySQL là TINYINT(1), chứa được mọi số từ -128 đến 127. Cột chỉ chứa 0 và 1 trở thành bit; cột chứa 2 hoặc -1 vẫn là số để không giá trị nào đổi nghĩa.bool_kept_numeric
UNSIGNED integersTINYINT UNSIGNED là tinyint; các kiểu khác là số nguyên rộng hơn kế tiếp kèm CHECK không âm, BIGINT UNSIGNED là bigint khi mọi giá trị vừa, nếu không thì decimal(38,0)SQL Server không có số nguyên không dấu ngoài tinyint, từ 0 đến 255. Kiểu rộng hơn chứa được toàn bộ dải không dấu, và ràng buộc kiểm tra chặn giá trị âm như MySQL.unsigned_widened
ZEROFILL and display widthsbị 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)real hoặc float, bỏ số chữ số thập phân cố địnhSố dấu phẩy động của SQL Server 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)decimal(p,s) đến 38 chữ số; vượt quá thì nvarchardecimal của SQL Server 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)bit; bigint đến 63 bit; decimal(20,0) cho BIT(64)Một bit đơn là có hoặc không; trường bit rộng hơn đượ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)NULLSQL Server 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 NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
DEFAULT '0000-00-00'không có giá trị mặc địnhGiá trị mặc định mà SQL Server không lưu được sẽ bị bỏ, thay vì thay bằng một ngày bịa ra.zero_date_default
TIMEtime khi mọi giá trị nằm trong một ngày, nếu không thì nvarcharTIME của MySQL là khoảng thời gian từ -838:59:59 đến 838:59:59; time của SQL Server là giờ trong ngày. Cột có giá trị dài hơn hoặc âm giữ chúng dạng văn bản.time_as_interval
YEARsmallint kèm CHECK phạm viSQL Server 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)nvarchar(n)nvarchar chứa mọi ký tự trên mọi phiên bản được hỗ trợ, và MySQL trả về giá trị CHAR không có khoảng trắng cuối, đúng như nvarchar giữ chúng.
text with characters past U+FFFF (emoji) in VARCHAR(n)nvarchar(2n), hoặc nvarchar(max) khi vượt 4000nvarchar đếm theo đơn vị UTF-16 và một emoji chiếm hai đơn vị, nên cột được cấp đủ chỗ cho mọi giá trị.text_length_widened
DATETIMEdatetime2DATETIME là thời gian theo đồng hồ, không kèm múi giờ, giống datetime2.
TIMESTAMPdatetimeoffset 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
ENUMnvarchar 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)giá trị rỗng được ràng buộc kiểm tra cho phépMySQL 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. Các hàng đó được giữ và ràng buộc kiểm tra cho phép chúng.enum_invalid_value
ENUM holding values outside its listkhô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
SETnvarchar như MySQL ghi ('a,b')SQL Server không có mảng; văn bản là chuỗi MySQL trả về.
JSONnvarchar(max)Hàm JSON của SQL Server đọc JSON từ văn bản. Ràng buộc ISJSON sẽ từ chối giá trị vô hướng như 1 hoặc "x" trước SQL Server 2022, mà MySQL vẫn giữ.
NUL bytes in textđược giữnvarchar 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 setbyte 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 nvarchar.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_INCREMENTIDENTITY, bộ đếm đặt sau các id đã sao chépCác id đã sao chép được nạp với IDENTITY_INSERT, 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 keymột bộ đếm cho cả bảngMyISAM đếm theo nhóm của cột đầu tiên trong khóa; SQL Server có một bộ đếm cho mỗi bảng.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPmột trình kích hoạt AFTER 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ó. Nó nối theo khóa chính, nên bảng cần có khóa chính.on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary keykhông được chuyển sangTrình kích hoạt tìm các hàng đã cập nhật theo khóa chính; không có khóa chính thì không tìm được.on_update_without_key
generated columnscột tính toán, PERSISTED khi nguồn lưu chúngSQL Server tính chúng theo cùng hai cách.
generated columns with functions SQL Server lacksmột cột thườngCông thức không viết được cho SQL Server để lại một cột thường và một dòng trong báo cáo.generated_not_translated
INVISIBLE columnscột thườngSQL Server không có cột ẩn.invisible_column
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 SQL Server lackskhông được tạoRàng buộc kiểm tra không viết được cho SQL Server sẽ bị bỏ và được báo cáo.check_skipped
CHECK ... NOT ENFORCEDkhô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 SQL Server lackskhông có giá trị mặc địnhGiá trị mặc định không viết được cho SQL Server 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 toàn bộ cộtSQL Server lập chỉ mục toàn bộ cột; khóa duy nhất trên tiền tố cũng duy nhất trên toàn bộ cột, nên mọi hàng đều nạp được.prefix_whole_column
FULLTEXT indexeskhông được tạoTìm kiếm toàn văn của SQL Server cần một catalog và truy vấn riêng.fulltext_not_created
SPATIAL indexeskhông được tạoChỉ mục không gian trên cột hình học cần một hộp giới hạn mà bản dump không nêu.spatial_index_not_created
functional indexes, and indexes on columns of unlimited lengthkhông được tạoSQL Server không lập chỉ mục trên biểu thức, cũng như trên cột nvarchar(max) và varbinary(max).index_skipped
foreign keyssau dữ liệu với WITH NOCHECK, rồi kiểm tra 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 được tạo trước và kiểm tra sau cùng; hàng mồ côi khiến khóa ở trạng thái chưa kiểm tra kèm cảnh báo thay vì dừng quá trình nạp.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server từ chối các thao tác lan truyền có thể chạm tới một bảng hai lần; MySQL cho phép.foreign_key_action_dropped
foreign keys to columns without a unique keykhông được tạoSQL Server cần khóa chính hoặc chỉ mục duy nhất không có NULL trên các cột được tham chiếu; InnoDB thì không.foreign_key_skipped
table and column namesnhư đã viết; đổi tên khi chỉ khác nhau về hoa thườngTên trong SQL Server không phân biệt hoa thường với collation thông thường.identifier_renamed
names over 116 charactersrút ngắnTên trong SQL Server tối đa 128 ký tự, một phần dành cho các số giúp tên không trùng nhau.name_shortened
GEOMETRY, POINT, POLYGON...geometry, kèm SRID của từng giá trịKiểu geometry riêng của SQL Server giữ mọi hình và hệ quy chiếu không gian của nó.
INET4, INET6, UUID (MariaDB)nvarchar(39), uniqueidentifieruniqueidentifier là UUID của SQL Server; địa chỉ được giữ dạng văn bản.
BINARY, VARBINARY, BLOBbinary, varbinary, varbinary(max)Byte vẫn là byte.
PARTITION BYmột bảngCác hàng giữ nguyên; hãy phân vùng lại bảng trong SQL Server 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 enginesbảng thườngSQL Server 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 TABLEkiể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 TABLEgeometryĐịnh dạng hình học của MySQL được nhận diện từ giá trị.
_ci collationscollation của cơ sở dữ liệu, thường không phân biệt hoa thườngSQL Server so sánh văn bản không phân biệt hoa thường với collation thông thường, như _ci của MySQL.
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 rowsNULLTrì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 VALUESgiá 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 defaultNULLKhông có giá trị nào để sao chép.default_keyword_null
REPLACE and INSERT IGNOREhà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 knownvarchar(max)Vă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 columnNULLBả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 geometriesNULLByte 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
CREATE SEQUENCE (MariaDB)CREATE SEQUENCE ... AS bigint, kèm giá trị tiếp theoSQL Server có sequence với cùng các tùy chọn; mỗi sequence tiếp tục từ chỗ bản dump dừng lại.
VECTOR(n) (MariaDB 11.7+)nvarchar(max) với các số thực dưới dạng mảng JSONChỉ SQL Server 2025 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 SQL Server

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.

sqlcmd -b -f 65001 -S localhost -d mydb -i mariadb.sql_server.sql

Khóa ngoại được thêm với WITH NOCHECK rồi được kiểm tra. Nếu một hàng 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 kiểm tra, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy chạy sqlcmd trên cùng máy với máy chủ. Mỗi lô tối đa 1000 hàng được commit riêng, nên nhật ký giao dịch luôn 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 SQL Server.

Câu hỏi về MariaDB sang SQL Server

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?

UUID thành uniqueidentifier, cột INET thành nvarchar, JSON thành nvarchar(max), 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 và báo cáo đếm chúng.

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 SQL Server, 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 SQL Server nào?

SQL Server 2017 đến 2025. Cùng một tập lệnh nạp được trên từng phiên bản, và dừng ở lỗi đầu tiên nếu có sự cố.