SQLite を MariaDB に変換
SQLite データベースファイル (.db、.sqlite、.sqlite3) または sqlite3 の .dump が書き出す SQL をドロップすると、同じテーブル、キー、インデックス、データを持つ MariaDB スクリプトをダウンロードできます。各列には値が収まる型を付け、MariaDB がそのまま保持できない値はすべてレポートに記載されます。
18 行を変換、修正なし、却下なし
shop_2024_sqlite.sql のテーブルSQLite のダンプ · sqlite3 で作成 · utf-8
customers8 行
7 列 id bigint not null name text not null email varchar(768) not null country text not null is_active tinyint(1) not null signed_up date created_at datetime not null orders10 行
9 列 id bigint not null customer_id bigint not null status varchar(768) not null total decimal(10,2) not null items int not null ordered_at datetime not null shipped_at datetime note text receipt blob
未変換
- ビュー order_totals
- トリガー orders_shipped
これらはデータベースごとに独自の言語で書かれます。MariaDB 用に書き直してください。
-- Written by IntoSQL from a SQLite dump. Load it with: mariadb --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE TABLE `customers` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`email` varchar(768) NOT NULL,
`country` text NOT NULL DEFAULT 'US',
`is_active` tinyint(1) NOT NULL DEFAULT 1,
`signed_up` date,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
CONSTRAINT `check1` CHECK (char_length(`country`) = 2)
) AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT,
`customer_id` bigint NOT NULL,
`status` varchar(768) NOT NULL DEFAULT 'pending',
`total` decimal(10,2) NOT NULL,
`items` int NOT NULL DEFAULT 1,
`ordered_at` datetime NOT NULL,
`shipped_at` datetime,
`note` text,
`receipt` blob,
PRIMARY KEY (`id`),
KEY `idx_orders_customer` (`customer_id`),
KEY `idx_orders_status_date` (`status`,`ordered_at`),
CONSTRAINT `check1` CHECK (`status` IN ('pending', 'paid', 'shipped', 'cancelled')),
FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`) ON DELETE CASCADE
) AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (1,1,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (2,2,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (3,1,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (4,4,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放',X'25504446');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door;\nring twice',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (6,6,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (7,8,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL,NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (8,2,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (9,3,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`receipt`) VALUES (10,7,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL);
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
修正
修正が必要な箇所はありませんでした。
確認が必要
- ソースでは 1 個のテキスト列が大文字と小文字を区別せずに比較します。MariaDB は厳密に比較するため、一意キーや検索の動作が変わる場合があります。 必要な列には、大文字と小文字を区別しない照合順序か列の型を使ってください。
- 2 件のビュー、トリガー、ルーチン、イベントは変換されません。レポートにそれぞれ記載しています。 MariaDB で手動で作り直してください。
ファイルはこのコンピューター上で変換され、アップロードされることはありません。
その他のサンプル:
SQLite から MariaDB で変わること
各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
列のすべての値が収まる型
SQLite はどの列にもどんな値でも保存できるため、宣言された型は目安です。各列にはすべての値が収まる型を付け、混在した値を持つ列はそのテキストを保ちます。
BOOLEAN, BOOL
tinyint(1)
すべての値が 0 か 1 の場合です。ほかの値も含む列は、それらを数値またはテキストとして保ちます。
TEXT, VARCHAR(n), CHAR(n), CLOB
1024 文字までは varchar(n)、それを超えると text 型
SQLite は長さを強制しません。宣言された長さは、すべての値が収まる場合にだけ保ちます。
DECIMAL(p,s), NUMERIC
すべての値が収まれば正確な型、それ以外は double
SQLite はこれらを整数または double として保存します。宣言された精度は、値が収まる場合にだけ保ちます。
BLOB, and columns holding bytes
blob 型
バイト列はバイト列のままです。同じ列にあるテキストや数値は、そのバイト列として保ちます。
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
date、datetime(p)
すべての値が日付、または日付と時刻の場合です。エポック形式の数値やほかのテキストは、値をそのまま保ちます。
JSON holding JSON text
json
すべての値が JSON のオブジェクトまたは配列の場合です。
Infinity in REAL columns
NULL
MariaDB の double には無限大がないため、それらの値は NULL になり、レポートで件数を示します。
レポートの行: invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENT
AUTO_INCREMENT、最大の ID または sqlite_sequence の値の後から継続
rowid になるのは、正確に INTEGER PRIMARY KEY と宣言された列だけです。各行は ID を保ち、カウンターはこれまでに割り当てられた最大の ID の後から始まります。
COLLATE NOCASE
厳密な比較 (utf8mb4_bin)
テーブルは utf8mb4_bin を使うため、SQLite のデフォルトと同じくテキストを厳密に比較します。NOCASE 列は大文字と小文字を区別しない動作を失います。
レポートの行: case_insensitive_collation
generated columns
生成列、ソースと同じく STORED または VIRTUAL
MariaDB も同じ方法で計算します。
generated columns with functions IntoSQL doesn't write, and the || operator
普通の列
書き換えられない式は、普通の列とレポートの 1 行になります。ダンプには生成列の値が含まれません。
レポートの行: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
デフォルト値なし
書き換えられないデフォルト値は含めず、レポートに記載します。CURRENT_TIMESTAMP と datetime('now') は書き出します。
レポートの行: default_not_translated
CHECK constraints
変換済み
チェック制約は同じで、各行の読み込み時に検証します。
CHECK constraints with functions IntoSQL doesn't write
作成しない
書き換えられないチェック制約は含めず、レポートに記載します。
レポートの行: check_skipped
partial and expression indexes
作成しない
IntoSQL が書き出すのは列全体に対するインデックスです。その他は読み込み後に作り直してください。
レポートの行: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
外部キー、FOREIGN_KEY_CHECKS=0 で読み込み
SQLite は指示されたときにしか外部キーをチェックしないため、親のない行はよくあります。それらの行も読み込み、読み込みを止めずにキーを未チェックのまま残して警告します。
foreign keys to tables the dump doesn't create
作成しない
キーは存在しないテーブルを参照できません。
レポートの行: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
NOT NULL を削除
SQLite では rowid 以外の主キーが NULL を持てます。変換先ではその列を NOT NULL にできません。そうすると読み込みが止まります。
レポートの行: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
レポートに記載
コードは SQLite 独自の言語で書かれており、仮想テーブルには SQLite のモジュールが必要です。作り直せるよう一覧にします。内部テーブルはコピーしません。
レポートの行: not_converted_objects
dumps without CREATE TABLE (--data-only)
値から読み取った型
データのみのダンプには行しかないため、型は値から決まり、列には番号が付きます。
レポートの行: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr()、replace()、char()、|| はシェルが書き出すとおりに評価します。その他の式はデータベースなしでは評価できません。
レポートの行: expression_value
NUL characters in text
保持
sqlite3 シェルと Python はダンプ時に NUL 文字でテキストを切り詰めるため、ダンプにはその前の部分しか含まれません。
text that isn't valid UTF-8
不正なバイトを置換文字に
ダンプはこうしたテキストを生のバイトとして書き出します。スクリプトは UTF-8 です。
レポートの行: invalid_utf8_replaced
text decoded twice (ñ)
そのままコピー
ダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。
レポートの行: mojibake_suspected
| SQLite では | MariaDB では | レポートの行 |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | 列のすべての値が収まる型SQLite はどの列にもどんな値でも保存できるため、宣言された型は目安です。各列にはすべての値が収まる型を付け、混在した値を持つ列はそのテキストを保ちます。 | |
| BOOLEAN, BOOL | tinyint(1)すべての値が 0 か 1 の場合です。ほかの値も含む列は、それらを数値またはテキストとして保ちます。 | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | 1024 文字までは varchar(n)、それを超えると text 型SQLite は長さを強制しません。宣言された長さは、すべての値が収まる場合にだけ保ちます。 | |
| DECIMAL(p,s), NUMERIC | すべての値が収まれば正確な型、それ以外は doubleSQLite はこれらを整数または double として保存します。宣言された精度は、値が収まる場合にだけ保ちます。 | |
| BLOB, and columns holding bytes | blob 型バイト列はバイト列のままです。同じ列にあるテキストや数値は、そのバイト列として保ちます。 | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date、datetime(p)すべての値が日付、または日付と時刻の場合です。エポック形式の数値やほかのテキストは、値をそのまま保ちます。 | |
| JSON holding JSON text | jsonすべての値が JSON のオブジェクトまたは配列の場合です。 | |
| Infinity in REAL columns | NULLMariaDB の double には無限大がないため、それらの値は NULL になり、レポートで件数を示します。 | invalid_value_null |
| INTEGER PRIMARY KEY, AUTOINCREMENT | AUTO_INCREMENT、最大の ID または sqlite_sequence の値の後から継続rowid になるのは、正確に INTEGER PRIMARY KEY と宣言された列だけです。各行は ID を保ち、カウンターはこれまでに割り当てられた最大の ID の後から始まります。 | |
| COLLATE NOCASE | 厳密な比較 (utf8mb4_bin)テーブルは utf8mb4_bin を使うため、SQLite のデフォルトと同じくテキストを厳密に比較します。NOCASE 列は大文字と小文字を区別しない動作を失います。 | case_insensitive_collation |
| generated columns | 生成列、ソースと同じく STORED または VIRTUALMariaDB も同じ方法で計算します。 | |
| generated columns with functions IntoSQL doesn't write, and the || operator | 普通の列書き換えられない式は、普通の列とレポートの 1 行になります。ダンプには生成列の値が含まれません。 | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | デフォルト値なし書き換えられないデフォルト値は含めず、レポートに記載します。CURRENT_TIMESTAMP と datetime('now') は書き出します。 | default_not_translated |
| CHECK constraints | 変換済みチェック制約は同じで、各行の読み込み時に検証します。 | |
| CHECK constraints with functions IntoSQL doesn't write | 作成しない書き換えられないチェック制約は含めず、レポートに記載します。 | check_skipped |
| partial and expression indexes | 作成しないIntoSQL が書き出すのは列全体に対するインデックスです。その他は読み込み後に作り直してください。 | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | 外部キー、FOREIGN_KEY_CHECKS=0 で読み込みSQLite は指示されたときにしか外部キーをチェックしないため、親のない行はよくあります。それらの行も読み込み、読み込みを止めずにキーを未チェックのまま残して警告します。 | |
| foreign keys to tables the dump doesn't create | 作成しないキーは存在しないテーブルを参照できません。 | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | NOT NULL を削除SQLite では rowid 以外の主キーが NULL を持てます。変換先ではその列を NOT NULL にできません。そうすると読み込みが止まります。 | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | レポートに記載コードは SQLite 独自の言語で書かれており、仮想テーブルには SQLite のモジュールが必要です。作り直せるよう一覧にします。内部テーブルはコピーしません。 | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | 値から読み取った型データのみのダンプには行しかないため、型は値から決まり、列には番号が付きます。 | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr()、replace()、char()、|| はシェルが書き出すとおりに評価します。その他の式はデータベースなしでは評価できません。 | expression_value |
| NUL characters in text | 保持sqlite3 シェルと Python はダンプ時に NUL 文字でテキストを切り詰めるため、ダンプにはその前の部分しか含まれません。 | |
| text that isn't valid UTF-8 | 不正なバイトを置換文字にダンプはこうしたテキストを生のバイトとして書き出します。スクリプトは UTF-8 です。 | invalid_utf8_replaced |
| text decoded twice (ñ) | そのままコピーダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。 | mojibake_suspected |
スクリプトを MariaDB に読み込む
スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。
mariadb --default-character-set=utf8mb4 mydb < sqlite.mariadb.sql外部キーはダンプが宣言するとおりに作成し、mysqldump と同様に、行の読み込み中は FOREIGN_KEY_CHECKS=0 にします。
大きなダンプでは、サーバーと同じマシンでクライアントを実行し、1 行がとても大きい場合は max_allowed_packet を上げてください。
IntoSQL Pro なら、デスクトップアプリやコマンドラインからファイルを MariaDB に直接読み込めます。スクリプトを書き出す必要はありません。
SQLite を最適な方法でダンプする
コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。
- データベースファイル自体をそのまま変換し、ブラウザでページ単位で読み込みます。変更が -wal ファイルに残らないよう、先に書き込み中のアプリを閉じてください。
- sqlite3 app.db .dump > app.sql で同じデータベースを SQL として書き出せます。これも .sql または .sql.gz として変換できます。
- DB Browser for SQLite では File、Export、Database to SQL file の順に選ぶとその SQL を書き出せます。Python の iterdump() も同様です。
変換されないもの
ビューとトリガーは SQLite 独自の言語で書かれています。黙って削除することはなく、レポートに名前で一覧するので、MariaDB 向けに書き直せます。FTS5 や R*Tree などの仮想テーブルも一覧し、そのシャドウテーブルは含めません。
SQLite から MariaDB への変換に関する質問
ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ
ダンプはアップロードされますか?
いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。
ダンプはどのくらいの大きさまで扱えますか?
コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。
.db ファイル自体を変換できますか?
はい。.db、.sqlite、.sqlite3 ファイルをドロップしてください。ブラウザで読み込まれ、アップロードされることはありません。NUL 文字を含むテキストや double のすべての桁も保存されたとおりに届きます。.dump ではこれらが欠けることがあります。
どの SQLite バージョンのダンプに対応していますか?
SQLite 3.0 以降の UTF-8 または UTF-16 のデータベースファイルと、sqlite3 シェルの .dump または Python の iterdump() で作成したダンプです。すべてのテスト用ファイルとダンプは sqlite3 3.31 から 3.54 で作成し、STRICT と WITHOUT ROWID のテーブルも含め、ソースとセル単位で比較しています。
SQLite が型を強制しない場合、列の型はどう決まりますか?
宣言された型は目安で、値によって決まります。すべての値が収まれば、列は integer、decimal、double、date、datetime、tinyint(1)、blob、text の型 のいずれかになります。混在した値を持つ列はそのテキストを保ち、どの列かはレポートに示します。
INTEGER PRIMARY KEY と AUTOINCREMENT は保持されますか?
はい。INTEGER PRIMARY KEY は AUTO_INCREMENT になり、各行は ID を保ちます。次の ID は最大の ID の後から、AUTOINCREMENT がある場合は sqlite_sequence の値の後から続きます。
ビューとトリガーはどうなりますか?
データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。
スクリプトはどの MariaDB バージョンで読み込めますか?
MariaDB 10.11 以降です。すべてのテスト用ダンプを 10.11 と 11.4 で読み込み、問題があれば最初のエラーで止まります。