本文へスキップ
IntoSQL ホーム

MariaDB を SQL Server に変換

mariadb-dump、mysqldump、phpMyAdmin、Adminer で作成したダンプ (.sql または .sql.gz) をドロップすると、同じテーブル、キー、インデックス、データを持つ SQL Server スクリプトをダウンロードできます。SQL Server がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。

ファイル
sqlshop_2024_mariadb.sqlサンプルファイル、6.6 KB
データベース

18 行を変換、修正 10 件、却下なし

表示

shop_2024_mariadb.sql のテーブルMariaDB 11.8.9-MariaDB-ubu2404 のダンプ · mariadb-dump で作成 · utf8mb4

  • customers8 行4
    8 列
    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 行6
    12 列
    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

修正

  1. customers の "id" は符号なしのため、負でないことを確かめるチェック制約付きの bigint にしました。
  2. customers の "name" には絵文字など SQL Server が 2 文字と数える文字があるため、nvarchar(200) にしました。
  3. customers の "signed_up" は NULL を許可するようになりました。一部の値が保存できず、NULL になったためです。
  4. customers の "signed_up" のデフォルト値 0000‑00‑00 は SQL Server が受け付ける日付ではないため、列にデフォルト値はありません。
  5. orders の "customer_id" は符号なしのため、負でないことを確かめるチェック制約付きの bigint にしました。
  6. orders の "id" は符号なしのため、負でないことを確かめるチェック制約付きの bigint にしました。
  7. orders の "items" は符号なしのため、負でないことを確かめるチェック制約付きの int にしました。
  8. orders の "note" には絵文字など SQL Server が 2 文字と数える文字があるため、nvarchar(510) にしました。
  9. orders の "status" の 1 行には、MySQL が無効な入力に対して保存する空の値があります。値のチェック制約はこの値を許可します。
  10. orders の "updated_at" は更新のたびに現在時刻に変わります。SQL Server ではトリガーがこれを行います。

確認が必要

  • customers の "signed_up" にある 1 個の値は、0000‑00‑00 のようなゼロ日付または存在しない日付で、SQL Server では保存できないため NULL にしました。 その日付に意味がある場合は、ダンプする前にソース側で実際の日付に置き換えてください。
  • orders の "shipped_at" にある 1 個の値は、0000‑00‑00 00:00:00 のようなゼロ日付または存在しない日付で、SQL Server では保存できないため NULL にしました。 その日付に意味がある場合は、ダンプする前にソース側で実際の日付に置き換えてください。

ファイルはこのコンピューター上で変換され、アップロードされることはありません。

その他のサンプル:

MariaDB から SQL Server で変わること

各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。

  • TINYINT(1), BOOL

    すべての値が 0 か 1 なら bit、それ以外は smallint

    MySQL の BOOL は -128 から 127 までの任意の数を保持できる TINYINT(1) です。0 と 1 だけを持つ列は bit になり、2 や -1 を持つ列は数値のままなので、意味が変わる値はありません。

    レポートの行: bool_kept_numeric

  • UNSIGNED integers

    TINYINT UNSIGNED は tinyint。他は負でないことを確かめる CHECK 付きの 1 段大きい整数型。BIGINT UNSIGNED は、すべての値が収まれば bigint、それ以外は decimal(38,0)

    SQL Server には、0 から 255 の tinyint を除いて符号なし整数がありません。より大きな型で符号なしの範囲全体を保持し、MySQL と同様にチェック制約で負の値を防ぎます。

    レポートの行: unsigned_widened

  • ZEROFILL and display widths

    削除

    ゼロ埋めは数値の表示方法であり、数値の一部ではありません。数値は残ります。ゼロ埋めが必要なら、読み出すときに書式を整えてください。

    レポートの行: zerofill_dropped

  • FLOAT(M,D)

    real または float、桁数指定なし

    SQL Server の浮動小数点数には固定の桁数がありません。保存された値はそのままコピーします。

    レポートの行: float_scale_dropped

  • DECIMAL(p,s)

    38 桁までは decimal(p,s)、それを超えると nvarchar

    SQL Server の decimal は 38 桁まで保持します。それより大きい小数は、すべての桁を正確に保つためテキストで保持します。

    レポートの行: decimal_as_text

  • BIT(1), BIT(n)

    bit。63 ビットまでは bigint、BIT(64) は decimal(20,0)

    1 ビットははい/いいえを表し、それより幅の広いビットフィールドはビットが表す数値として保存します。

  • zero, partial or impossible dates (0000-00-00, 2024-02-30)

    NULL

    SQL Server は実在する暦の日付だけを保存します。MySQL は SQL モードが許せばゼロ日付や存在しない日付を保持しますが、これらは NULL になり、レポートでその数を示します。

    レポートの行: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL を削除

    値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。

    レポートの行: not_null_relaxed

  • DEFAULT '0000-00-00'

    デフォルト値なし

    SQL Server が保存できないデフォルト値は、架空の日付に置き換えずに省きます。

    レポートの行: zero_date_default

  • TIME

    すべての値が 1 日以内なら time、それ以外は nvarchar

    MySQL の TIME は -838:59:59 から 838:59:59 までの期間で、SQL Server の time は時刻です。それより長い値や負の値を持つ列は、テキストとして保持します。

    レポートの行: time_as_interval

  • YEAR

    範囲の CHECK 付きの smallint

    SQL Server には年の型がありません。チェック制約で、MySQL が許可するのと同じ値に限定します。

  • CHAR(n), VARCHAR(n)

    nvarchar(n)

    nvarchar はサポートするどのバージョンでもすべての文字を保持できます。MySQL は CHAR 値を末尾の空白なしで返し、nvarchar はそのまま保ちます。

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

    nvarchar(2n)、4000 を超えると nvarchar(max)

    nvarchar は UTF-16 単位で数え、絵文字は 2 単位を使うため、すべての値が収まる長さにします。

    レポートの行: text_length_widened

  • DATETIME

    datetime2

    DATETIME はタイムゾーンを持たない時計の時刻で、datetime2 と同じです。

  • TIMESTAMP

    ダンプが示すタイムゾーンでの datetimeoffset。示されていなければ UTC

    TIMESTAMP はある瞬間を表します。ダンプには書き出したときのタイムゾーンが示されます (mysqldump は UTC で書き出します)。示されていない場合は UTC として読み込み、レポートにその旨を記載します。

    レポートの行: timestamp_zone_assumed

  • ENUM

    値の CHECK 付きの nvarchar

    チェック制約付きのテキストは同じ値を保ちます。

  • ENUM holding '' (MySQL's error value)

    チェック制約が許可する空の値

    緩い SQL モードでは、無効な値が ENUM に入ると MySQL は空文字列を保存します。これらの行は残し、チェック制約でも許可します。

    レポートの行: enum_invalid_value

  • ENUM holding values outside its list

    CHECK なし

    リストにない値はチェック制約に違反するため、チェック制約は作成しません。

    レポートの行: enum_check_skipped

  • SET

    MySQL が書き出すとおりの nvarchar ('a,b')

    SQL Server には配列がありません。テキストは MySQL が返すものと同じです。

  • JSON

    nvarchar(max)

    SQL Server の JSON 関数はテキストから JSON を読みます。ISJSON のチェック制約を付けると、SQL Server 2022 より前では 1 や "x" のようなスカラー値が拒否されますが、MySQL はこれらを保持します。

  • NUL bytes in text

    保持

    nvarchar は NUL 文字を保持できるため、値はそのままコピーします。

  • text that isn't valid in its character set

    不正なバイトを置換文字に

    nvarchar として書き込むには、テキストを文字として読む必要があります。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

    ダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。

    レポートの行: mojibake_suspected

  • AUTO_INCREMENT

    IDENTITY、カウンターはコピーした ID の後から

    コピーした ID は IDENTITY_INSERT で読み込み、カウンターは最大の ID かダンプの AUTO_INCREMENT のうち大きい方の後から続きます。

  • MyISAM AUTO_INCREMENT on the second column of a key

    テーブルに 1 つのカウンター

    MyISAM はキーの最初の列のグループごとに採番します。SQL Server ではテーブルごとにカウンターは 1 つです。

    レポートの行: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    AFTER UPDATE トリガー

    更新でその列が設定されなかった場合、トリガーが列を現在時刻にします。主キーで結合するため、テーブルに主キーが必要です。

    レポートの行: on_update_trigger

  • ON UPDATE CURRENT_TIMESTAMP on a table without a primary key

    引き継がない

    トリガーは更新された行を主キーで探すため、主キーがないと動きません。

    レポートの行: on_update_without_key

  • generated columns

    計算列。ソースで保存されていれば PERSISTED

    SQL Server も同じ 2 つの方式で計算します。

  • generated columns with functions SQL Server lacks

    普通の列

    SQL Server 用に書き換えられない式は、普通の列とレポートの 1 行になります。

    レポートの行: generated_not_translated

  • INVISIBLE columns

    通常の列

    SQL Server には非表示の列がありません。

    レポートの行: invisible_column

  • CHECK constraints

    変換して CREATE TABLE 内に記述

    CREATE TABLE 内のチェック制約は、各行の読み込み時に検証されます。

  • CHECK constraints with functions SQL Server lacks

    作成しない

    SQL Server 用に書き換えられないチェック制約は省き、レポートに記載します。

    レポートの行: check_skipped

  • CHECK ... NOT ENFORCED

    作成しない

    MySQL はこれらのチェック制約を適用せずに保持するため、違反する行がある可能性があります。

    レポートの行: check_not_enforced

  • defaults with functions SQL Server lacks

    デフォルト値なし

    SQL Server 用に書き換えられないデフォルト値は省き、レポートに記載します。

    レポートの行: default_not_translated

  • keys and indexes on a prefix, c(20)

    列全体のインデックス

    SQL Server は列全体にインデックスを作ります。先頭部分で一意なキーは列全体でも一意なので、すべての行が読み込まれます。

    レポートの行: prefix_whole_column

  • FULLTEXT indexes

    作成しない

    SQL Server の全文検索には、カタログと専用のクエリが必要です。

    レポートの行: fulltext_not_created

  • SPATIAL indexes

    作成しない

    ジオメトリ列の空間インデックスには、ダンプに示されていない境界ボックスが必要です。

    レポートの行: spatial_index_not_created

  • functional indexes, and indexes on columns of unlimited length

    作成しない

    SQL Server は、式にも、nvarchar(max) と varbinary(max) の列にもインデックスを作れません。

    レポートの行: index_skipped

  • foreign keys

    データの後に WITH NOCHECK で作成してからチェックし、孤立した行があれば警告

    ダンプは FOREIGN_KEY_CHECKS=0 で読み込まれ、MyISAM はチェックを行わないため、親のない行はよくあります。キーを先に作成し、最後にチェックします。孤立した行があれば、読み込みを止めずにキーを未チェックのまま残して警告します。

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

    NO ACTION

    SQL Server は、同じテーブルに 2 回到達しうるカスケードを拒否します。MySQL は許可します。

    レポートの行: foreign_key_action_dropped

  • foreign keys to columns without a unique key

    作成しない

    SQL Server では参照先の列に主キーか NULL のない一意インデックスが必要ですが、InnoDB では不要です。

    レポートの行: foreign_key_skipped

  • table and column names

    書かれたとおり。大文字小文字だけが違う場合は名前を変更

    SQL Server の名前は、通常の照合順序では大文字と小文字を区別しません。

    レポートの行: identifier_renamed

  • names over 116 characters

    短縮

    SQL Server の名前は 128 文字までで、その一部は名前を区別するための番号に使います。

    レポートの行: name_shortened

  • GEOMETRY, POINT, POLYGON...

    geometry、各値の SRID 付き

    SQL Server 独自の geometry 型は、すべての形状とその空間参照系を保持します。

  • INET4, INET6, UUID (MariaDB)

    nvarchar(39), uniqueidentifier

    uniqueidentifier は SQL Server の UUID です。アドレスはテキストとして保持します。

  • BINARY, VARBINARY, BLOB

    binary, varbinary, varbinary(max)

    バイトはバイトのままです。

  • PARTITION BY

    1 つのテーブル

    行は同じです。必要なら SQL Server でもう一度テーブルをパーティション分割してください。

    レポートの行: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    現在の行を持つテーブル

    ダンプには現在の行しか含まれません。

    レポートの行: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    通常のテーブル

    SQL Server のテーブルエンジンは 1 つだけです。

    レポートの行: engine_dropped

  • views, triggers, procedures, functions and events

    レポートに記載

    これらのコードは MySQL の言語で書かれているため、作り直せるよう一覧にします。

    レポートの行: not_converted_objects

  • dumps without CREATE TABLE

    値から読み取った型

    --no-create-info で作成したダンプには行しかないため、型は値から決まります。

    レポートの行: no_schema

  • geometries in a dump without CREATE TABLE

    geometry

    MySQL のジオメトリ形式を値から認識します。

  • _ci collations

    データベースの照合順序。通常は大文字小文字を区別しない

    SQL Server は通常の照合順序では、MySQL の _ci と同様に大文字と小文字を区別せずにテキストを比較します。

  • SET NAMES utf8 from utf8mb4 tables

    変換し、警告を表示

    MySQL 5.x の mysqldump は既定で 3 バイトの utf8 で書き出し、コンバーターがファイルを読む前にすべての絵文字を疑問符に置き換えます。

    レポートの行: dump_lost_four_byte_chars

  • dumps without SET NAMES whose text isn't UTF-8

    Latin-1 (Windows-1252) として読み込み

    MySQL の latin1 は Windows-1252 で、こうしたダンプでよく使われる文字コードです。

    レポートの行: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    UTF-8 として読み込み、警告を表示

    これらの文字コードはまだデコードできません。

    レポートの行: unsupported_charset

  • UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows

    評価

    一部のダンプツールは値をこうした関数呼び出しとして書き出します。これらは生成される値として読み込み、地理座標の WKT は経度を先にします。

  • other expressions in rows

    NULL

    データベースを実行しないコンバーターでは、これらを評価できません。

    レポートの行: expression_value

  • DEFAULT in VALUES

    列のデフォルト値

    リテラルのデフォルト値を行にコピーします。

    レポートの行: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    コピーする値がありません。

    レポートの行: default_keyword_null

  • REPLACE and INSERT IGNORE

    通常の行

    ダンプではキーごとに 1 行なので、行は同じです。

    レポートの行: replace_as_insert

  • types IntoSQL doesn't know

    nvarchar(max)

    テキストはどんな値も保持できます。読み込み後に型を変更してください。

    レポートの行: unknown_type

  • values that don't fit their column

    NULL

    破損したダンプや手書きのダンプには、列が保持できない値が含まれることがあります。それらを NULL にして、残りを読み込みます。

    レポートの行: invalid_value_null

  • unreadable geometries

    NULL

    ジオメトリでないバイト列は、ジオメトリとして保存できません。

    レポートの行: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    次の値を持つ CREATE SEQUENCE ... AS bigint

    SQL Server にも同じオプションのシーケンスがあります。各シーケンスはダンプの続きから進みます。

  • VECTOR(n) (MariaDB 11.7+)

    浮動小数点数の JSON 配列を持つ nvarchar(max)

    vector 型があるのは SQL Server 2025 だけです。JSON 配列はどのバージョンでもすべての浮動小数点数を保ちます。

    レポートの行: type_replaced

MariaDB ではSQL Server ではレポートの行
TINYINT(1), BOOLすべての値が 0 か 1 なら bit、それ以外は smallintMySQL の BOOL は -128 から 127 までの任意の数を保持できる TINYINT(1) です。0 と 1 だけを持つ列は bit になり、2 や -1 を持つ列は数値のままなので、意味が変わる値はありません。bool_kept_numeric
UNSIGNED integersTINYINT UNSIGNED は tinyint。他は負でないことを確かめる CHECK 付きの 1 段大きい整数型。BIGINT UNSIGNED は、すべての値が収まれば bigint、それ以外は decimal(38,0)SQL Server には、0 から 255 の tinyint を除いて符号なし整数がありません。より大きな型で符号なしの範囲全体を保持し、MySQL と同様にチェック制約で負の値を防ぎます。unsigned_widened
ZEROFILL and display widths削除ゼロ埋めは数値の表示方法であり、数値の一部ではありません。数値は残ります。ゼロ埋めが必要なら、読み出すときに書式を整えてください。zerofill_dropped
FLOAT(M,D)real または float、桁数指定なしSQL Server の浮動小数点数には固定の桁数がありません。保存された値はそのままコピーします。float_scale_dropped
DECIMAL(p,s)38 桁までは decimal(p,s)、それを超えると nvarcharSQL Server の decimal は 38 桁まで保持します。それより大きい小数は、すべての桁を正確に保つためテキストで保持します。decimal_as_text
BIT(1), BIT(n)bit。63 ビットまでは bigint、BIT(64) は decimal(20,0)1 ビットははい/いいえを表し、それより幅の広いビットフィールドはビットが表す数値として保存します。
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLSQL Server は実在する暦の日付だけを保存します。MySQL は SQL モードが許せばゼロ日付や存在しない日付を保持しますが、これらは NULL になり、レポートでその数を示します。invalid_date_null
NOT NULL columns with values that become NULLNOT NULL を削除値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
DEFAULT '0000-00-00'デフォルト値なしSQL Server が保存できないデフォルト値は、架空の日付に置き換えずに省きます。zero_date_default
TIMEすべての値が 1 日以内なら time、それ以外は nvarcharMySQL の TIME は -838:59:59 から 838:59:59 までの期間で、SQL Server の time は時刻です。それより長い値や負の値を持つ列は、テキストとして保持します。time_as_interval
YEAR範囲の CHECK 付きの smallintSQL Server には年の型がありません。チェック制約で、MySQL が許可するのと同じ値に限定します。
CHAR(n), VARCHAR(n)nvarchar(n)nvarchar はサポートするどのバージョンでもすべての文字を保持できます。MySQL は CHAR 値を末尾の空白なしで返し、nvarchar はそのまま保ちます。
text with characters past U+FFFF (emoji) in VARCHAR(n)nvarchar(2n)、4000 を超えると nvarchar(max)nvarchar は UTF-16 単位で数え、絵文字は 2 単位を使うため、すべての値が収まる長さにします。text_length_widened
DATETIMEdatetime2DATETIME はタイムゾーンを持たない時計の時刻で、datetime2 と同じです。
TIMESTAMPダンプが示すタイムゾーンでの datetimeoffset。示されていなければ UTCTIMESTAMP はある瞬間を表します。ダンプには書き出したときのタイムゾーンが示されます (mysqldump は UTC で書き出します)。示されていない場合は UTC として読み込み、レポートにその旨を記載します。timestamp_zone_assumed
ENUM値の CHECK 付きの nvarcharチェック制約付きのテキストは同じ値を保ちます。
ENUM holding '' (MySQL's error value)チェック制約が許可する空の値緩い SQL モードでは、無効な値が ENUM に入ると MySQL は空文字列を保存します。これらの行は残し、チェック制約でも許可します。enum_invalid_value
ENUM holding values outside its listCHECK なしリストにない値はチェック制約に違反するため、チェック制約は作成しません。enum_check_skipped
SETMySQL が書き出すとおりの nvarchar ('a,b')SQL Server には配列がありません。テキストは MySQL が返すものと同じです。
JSONnvarchar(max)SQL Server の JSON 関数はテキストから JSON を読みます。ISJSON のチェック制約を付けると、SQL Server 2022 より前では 1 や "x" のようなスカラー値が拒否されますが、MySQL はこれらを保持します。
NUL bytes in text保持nvarchar は NUL 文字を保持できるため、値はそのままコピーします。
text that isn't valid in its character set不正なバイトを置換文字にnvarchar として書き込むには、テキストを文字として読む必要があります。invalid_utf8_replaced
text decoded twice (ñ)そのままコピーダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected
AUTO_INCREMENTIDENTITY、カウンターはコピーした ID の後からコピーした ID は IDENTITY_INSERT で読み込み、カウンターは最大の ID かダンプの AUTO_INCREMENT のうち大きい方の後から続きます。
MyISAM AUTO_INCREMENT on the second column of a keyテーブルに 1 つのカウンターMyISAM はキーの最初の列のグループごとに採番します。SQL Server ではテーブルごとにカウンターは 1 つです。myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPAFTER UPDATE トリガー更新でその列が設定されなかった場合、トリガーが列を現在時刻にします。主キーで結合するため、テーブルに主キーが必要です。on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary key引き継がないトリガーは更新された行を主キーで探すため、主キーがないと動きません。on_update_without_key
generated columns計算列。ソースで保存されていれば PERSISTEDSQL Server も同じ 2 つの方式で計算します。
generated columns with functions SQL Server lacks普通の列SQL Server 用に書き換えられない式は、普通の列とレポートの 1 行になります。generated_not_translated
INVISIBLE columns通常の列SQL Server には非表示の列がありません。invisible_column
CHECK constraints変換して CREATE TABLE 内に記述CREATE TABLE 内のチェック制約は、各行の読み込み時に検証されます。
CHECK constraints with functions SQL Server lacks作成しないSQL Server 用に書き換えられないチェック制約は省き、レポートに記載します。check_skipped
CHECK ... NOT ENFORCED作成しないMySQL はこれらのチェック制約を適用せずに保持するため、違反する行がある可能性があります。check_not_enforced
defaults with functions SQL Server lacksデフォルト値なしSQL Server 用に書き換えられないデフォルト値は省き、レポートに記載します。default_not_translated
keys and indexes on a prefix, c(20)列全体のインデックスSQL Server は列全体にインデックスを作ります。先頭部分で一意なキーは列全体でも一意なので、すべての行が読み込まれます。prefix_whole_column
FULLTEXT indexes作成しないSQL Server の全文検索には、カタログと専用のクエリが必要です。fulltext_not_created
SPATIAL indexes作成しないジオメトリ列の空間インデックスには、ダンプに示されていない境界ボックスが必要です。spatial_index_not_created
functional indexes, and indexes on columns of unlimited length作成しないSQL Server は、式にも、nvarchar(max) と varbinary(max) の列にもインデックスを作れません。index_skipped
foreign keysデータの後に WITH NOCHECK で作成してからチェックし、孤立した行があれば警告ダンプは FOREIGN_KEY_CHECKS=0 で読み込まれ、MyISAM はチェックを行わないため、親のない行はよくあります。キーを先に作成し、最後にチェックします。孤立した行があれば、読み込みを止めずにキーを未チェックのまま残して警告します。
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server は、同じテーブルに 2 回到達しうるカスケードを拒否します。MySQL は許可します。foreign_key_action_dropped
foreign keys to columns without a unique key作成しないSQL Server では参照先の列に主キーか NULL のない一意インデックスが必要ですが、InnoDB では不要です。foreign_key_skipped
table and column names書かれたとおり。大文字小文字だけが違う場合は名前を変更SQL Server の名前は、通常の照合順序では大文字と小文字を区別しません。identifier_renamed
names over 116 characters短縮SQL Server の名前は 128 文字までで、その一部は名前を区別するための番号に使います。name_shortened
GEOMETRY, POINT, POLYGON...geometry、各値の SRID 付きSQL Server 独自の geometry 型は、すべての形状とその空間参照系を保持します。
INET4, INET6, UUID (MariaDB)nvarchar(39), uniqueidentifieruniqueidentifier は SQL Server の UUID です。アドレスはテキストとして保持します。
BINARY, VARBINARY, BLOBbinary, varbinary, varbinary(max)バイトはバイトのままです。
PARTITION BY1 つのテーブル行は同じです。必要なら SQL Server でもう一度テーブルをパーティション分割してください。partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)現在の行を持つテーブルダンプには現在の行しか含まれません。system_versioning_dropped
MyISAM, MEMORY and other engines通常のテーブルSQL Server のテーブルエンジンは 1 つだけです。engine_dropped
views, triggers, procedures, functions and eventsレポートに記載これらのコードは MySQL の言語で書かれているため、作り直せるよう一覧にします。not_converted_objects
dumps without CREATE TABLE値から読み取った型--no-create-info で作成したダンプには行しかないため、型は値から決まります。no_schema
geometries in a dump without CREATE TABLEgeometryMySQL のジオメトリ形式を値から認識します。
_ci collationsデータベースの照合順序。通常は大文字小文字を区別しないSQL Server は通常の照合順序では、MySQL の _ci と同様に大文字と小文字を区別せずにテキストを比較します。
SET NAMES utf8 from utf8mb4 tables変換し、警告を表示MySQL 5.x の mysqldump は既定で 3 バイトの utf8 で書き出し、コンバーターがファイルを読む前にすべての絵文字を疑問符に置き換えます。dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8Latin-1 (Windows-1252) として読み込みMySQL の latin1 は Windows-1252 で、こうしたダンプでよく使われる文字コードです。charset_guessed
sjis, cp932, gbk, big5 dumpsUTF-8 として読み込み、警告を表示これらの文字コードはまだデコードできません。unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows評価一部のダンプツールは値をこうした関数呼び出しとして書き出します。これらは生成される値として読み込み、地理座標の WKT は経度を先にします。
other expressions in rowsNULLデータベースを実行しないコンバーターでは、これらを評価できません。expression_value
DEFAULT in VALUES列のデフォルト値リテラルのデフォルト値を行にコピーします。default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLコピーする値がありません。default_keyword_null
REPLACE and INSERT IGNORE通常の行ダンプではキーごとに 1 行なので、行は同じです。replace_as_insert
types IntoSQL doesn't knownvarchar(max)テキストはどんな値も保持できます。読み込み後に型を変更してください。unknown_type
values that don't fit their columnNULL破損したダンプや手書きのダンプには、列が保持できない値が含まれることがあります。それらを NULL にして、残りを読み込みます。invalid_value_null
unreadable geometriesNULLジオメトリでないバイト列は、ジオメトリとして保存できません。bad_geometry
CREATE SEQUENCE (MariaDB)次の値を持つ CREATE SEQUENCE ... AS bigintSQL Server にも同じオプションのシーケンスがあります。各シーケンスはダンプの続きから進みます。
VECTOR(n) (MariaDB 11.7+)浮動小数点数の JSON 配列を持つ nvarchar(max)vector 型があるのは SQL Server 2025 だけです。JSON 配列はどのバージョンでもすべての浮動小数点数を保ちます。type_replaced

スクリプトを SQL Server に読み込む

スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。

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

外部キーは WITH NOCHECK で追加してからチェックします。存在しない行を参照している行があれば、途中で失敗する代わりに、どの制約かをスクリプトが示し、その制約は未チェックのまま残します。

大きなダンプでは、サーバーと同じマシンで sqlcmd を実行してください。最大 1000 行のバッチごとにコミットするため、トランザクションログは小さいままです。

MariaDB を最適な方法でダンプする

コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。

  • --default-character-set=utf8mb4 を使うと、絵文字などの 4 バイト文字が保たれます。utf8mb3 のダンプでは、コンバーターに届く前にこれらが失われます。
  • --hex-blob はバイナリ列と VECTOR の値を 16 進数で書き出すため、システム間でコピーしても壊れません。
  • --routines --triggers --events を使うとこれらのオブジェクトがダンプに含まれ、レポートで一覧できます。

変換されないもの

ビュー、トリガー、ストアドプロシージャ、関数、イベントは MariaDB 独自の言語で書かれています。黙って削除することはなく、レポートに名前で一覧するので、SQL Server 向けに書き直せます。

MariaDB から SQL Server への変換に関する質問

ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ

ダンプはアップロードされますか?

いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。

ダンプはどのくらいの大きさまで扱えますか?

コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。

どの MariaDB バージョンのダンプに対応していますか?

MariaDB 10.3 から 12 の mariadb-dump と mysqldump で作成したダンプで、INSERT はテーブルごとに 1 つでも行ごとに 1 つでも構いません。すべてのテスト用ダンプは MariaDB 10.11、11.4、11.8 で作成し、ソースとセル単位で比較しています。

UUID、INET6、JSON、VECTOR の列は保持されますか?

UUID は uniqueidentifier、INET の列は nvarchar、JSON は nvarchar(max)、VECTOR は浮動小数点数の JSON 配列になります。ゼロ日付は NULL になり、レポートで件数を示します。

AUTO_INCREMENT の値とシーケンスは保持されますか?

はい。各 AUTO_INCREMENT 列は IDENTITY 列になり、最大の ID の後から続きます。シーケンスは SQL Server のシーケンスになり、シーケンスから値を取るデフォルトは引き続きそこから取ります。

ストアドプロシージャとトリガーはどうなりますか?

データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。

スクリプトはどの SQL Server バージョンで読み込めますか?

SQL Server 2017 から 2025 です。同じスクリプトをそれぞれで読み込み、問題があれば最初のエラーで止まります。