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.
Đã chuyển đổi 18 hàng, 10 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
customers8 hàng4
8 cột id bigint not null name nvarchar(200) not null email nvarchar(150) not null country nvarchar(2) not null is_active bit not null signed_up date created_at datetimeoffset(0) not null last_ip nvarchar(39) orders10 hàng6
12 cột id bigint not null customer_id bigint not null status nvarchar(9) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(510) order_ref uniqueidentifier not null invoice int not null details nvarchar(max) updated_at datetimeoffset(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
- "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.
- "name" của customers chứa ký tự mà SQL Server đếm hai lần, như emoji, nên là nvarchar(200).
- "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 SQL Server chấp nhận, nên cột không có giá trị mặc định.
- "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.
- "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.
- "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.
- "note" của orders chứa ký tự mà SQL Server đếm hai lần, như emoji, nên là nvarchar(510).
- 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.
- "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 MariaDB | Trong SQL Server | Dòng báo cáo |
|---|---|---|
| TINYINT(1), BOOL | bit 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 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. | 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 đó. | 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 NULL | bỏ 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 |
| TIME | time 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 |
| YEAR | smallint 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 |
| DATETIME | datetime2DATETIME 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ê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 | 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é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 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 | 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. | 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 | IDENTITY, 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 key | mộ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_TIMESTAMP | mộ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 key | khô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 columns | cộ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 lacks | mộ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 columns | cộ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 lacks | khô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 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 SQL Server lacks | khô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 indexes | khô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 indexes | khô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 length | khô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 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ô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 path | NO 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 key | khô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 names | như đã 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 characters | rú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, BLOB | binary, varbinary, varbinary(max)Byte 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 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 engines | bả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 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 | 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ườ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 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 | nvarchar(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 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 |
| 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.sqlKhó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ố.