MariaDB を SQLite に変換
mariadb-dump、mysqldump、phpMyAdmin、Adminer で作成したダンプ (.sql または .sql.gz) をドロップすると、同じテーブル、キー、インデックス、データを持つ SQLite スクリプトをダウンロードできます。SQLite がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。
18 行を変換、修正 8 件、却下なし
shop_2024_mariadb.sql のテーブルMariaDB 11.8.9-MariaDB-ubu2404 のダンプ · mariadb-dump で作成 · utf8mb4
customers8 行3
8 列 id INTEGER not null name VARCHAR(100) not null email VARCHAR(150) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATE created_at TIMESTAMP not null last_ip TEXT orders10 行5
12 列 id INTEGER not null customer_id INTEGER not null status TEXT not null total DECIMAL(10,2) not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note VARCHAR(255) order_ref TEXT not null invoice INTEGER not null details TEXT updated_at TIMESTAMP not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;
CREATE TABLE customers ( -- People who bought at least once
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
country VARCHAR(2) DEFAULT 'US' NOT NULL,
is_active INTEGER DEFAULT 1 NOT NULL,
signed_up DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
last_ip TEXT,
CONSTRAINT customers_id_check CHECK (id >= 0)
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
status TEXT DEFAULT 'pending' NOT NULL,
total DECIMAL(10,2) NOT NULL,
items INTEGER DEFAULT 1 NOT NULL,
ordered_at DATETIME NOT NULL,
shipped_at DATETIME,
note VARCHAR(255),
order_ref TEXT NOT NULL,
invoice INTEGER NOT NULL,
details TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT orders_id_check CHECK (id >= 0),
CONSTRAINT orders_customer_id_check CHECK (customer_id >= 0),
CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled', '')),
CONSTRAINT orders_items_check CHECK (items >= 0),
CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id)
);
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at, last_ip) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00','::ffff:203.0.113.7'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42','2001:db8::1'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17',NULL),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00','::ffff:198.51.100.23'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00',NULL),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00','2001:db8:85a3::8a2e:370:7334'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59','::ffff:192.0.2.200'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, order_ref, invoice, details, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,'{"gift": false}','2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,'{"gift": true, "wrap": "red"}','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,'{"fragile": true}','2024-03-07 08:00:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice','4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'2024-03-08 17:20:00'),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,'{"fragile": true}','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,NULL,'2024-03-11 18:46:00'),
(8,2,'',19.99,1,'2024-03-12 08:00:00',NULL,'Status lost in an old import','7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,'{"parcels": [1, 2]}','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'2024-03-15 21:05:00');
-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_uq_email ON customers (email);
CREATE INDEX orders_idx_customer ON orders (customer_id);
CREATE INDEX orders_idx_status_date ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 1000) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 1000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 5000) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 5000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
CREATE TRIGGER orders_updated_at_on_update AFTER UPDATE ON orders FOR EACH ROW WHEN NEW.updated_at IS OLD.updated_at AND (NEW.id IS NOT OLD.id OR NEW.customer_id IS NOT OLD.customer_id OR NEW.status IS NOT OLD.status OR NEW.total IS NOT OLD.total OR NEW.items IS NOT OLD.items OR NEW.ordered_at IS NOT OLD.ordered_at OR NEW.shipped_at IS NOT OLD.shipped_at OR NEW.note IS NOT OLD.note OR NEW.order_ref IS NOT OLD.order_ref OR NEW.invoice IS NOT OLD.invoice OR NEW.details IS NOT OLD.details)
BEGIN
UPDATE orders SET updated_at = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;
END;
COMMIT;
-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;
修正
- customers の "id" は符号なしのため、負でないことを確かめるチェック制約付きの INTEGER にしました。
- customers の "signed_up" は NULL を許可するようになりました。一部の値が保存できず、NULL になったためです。
- customers の "signed_up" のデフォルト値 0000‑00‑00 は SQLite が受け付ける日付ではないため、列にデフォルト値はありません。
- orders の "customer_id" は符号なしのため、負でないことを確かめるチェック制約付きの INTEGER にしました。
- orders の "id" は符号なしのため、負でないことを確かめるチェック制約付きの INTEGER にしました。
- orders の "items" は符号なしのため、負でないことを確かめるチェック制約付きの INTEGER にしました。
- orders の "status" の 1 行には、MySQL が無効な入力に対して保存する空の値があります。値のチェック制約はこの値を許可します。
- orders の "updated_at" は更新のたびに現在時刻に変わります。SQLite ではトリガーがこれを行います。
確認が必要
- 1 個のシーケンスは作成しません。SQLite にはシーケンスがありません。 アプリケーションで必要なら、次の値をテーブルに保持してください。
- customers の "signed_up" にある 1 個の値は、0000‑00‑00 のようなゼロ日付または存在しない日付で、SQLite では保存できないため NULL にしました。 その日付に意味がある場合は、ダンプする前にソース側で実際の日付に置き換えてください。
- orders の "invoice" のデフォルト値は SQLite 用に書き換えられないため (a sequence)、列にデフォルト値はありません。 新しい行に必要なら、手動でデフォルト値を追加してください。
- orders の "shipped_at" にある 1 個の値は、0000‑00‑00 00:00:00 のようなゼロ日付または存在しない日付で、SQLite では保存できないため NULL にしました。 その日付に意味がある場合は、ダンプする前にソース側で実際の日付に置き換えてください。
ファイルはこのコンピューター上で変換され、アップロードされることはありません。
その他のサンプル:
MariaDB から SQLite で変わること
各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。
TINYINT(1), BOOL
値をそのまま持つ INTEGER
SQLite には boolean 型がなく、true と false は整数の 1 と 0 なので、すべての値が意味を保ちます。
UNSIGNED integers
負でないことを確かめる CHECK 付きの INTEGER。2^63-1 を超える値を持つ BIGINT UNSIGNED は TEXT
SQLite の整数は 64 ビットの符号付きです。MySQL と同様にチェック制約で負の値を防ぎ、符号付きの範囲を超える値は桁が失われないようテキストで保持します。
レポートの行: unsigned_widened
ZEROFILL and display widths
削除
ゼロ埋めは数値の表示方法であり、数値の一部ではありません。数値は残ります。ゼロ埋めが必要なら、読み出すときに書式を整えてください。
レポートの行: zerofill_dropped
FLOAT(M,D)
REAL、桁数指定なし
SQLite の浮動小数点数には固定の桁数がありません。保存された値はそのままコピーします。
レポートの行: float_scale_dropped
DECIMAL(p,s)
15 桁までは DECIMAL(p,s)、それを超えると TEXT
SQLite の数値が保てる有効桁数は約 15 桁です。それより大きい小数は、すべての桁を正確に保つためテキストで保持します。
レポートの行: decimal_as_text
BIT(1), BIT(n)
ビットの値を持つ INTEGER。BIT(64) は TEXT の数字
ビットフィールドは、ビットが表す数値として保存します。BIT(64) の最上位ビットは符号付き整数に収まらないため、その数値はテキストで保持します。
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
SQLite の日付関数は実在する暦の日付しか読みません。これらは NULL になり、他のどのデータベースと同様に、レポートでその数を示します。
レポートの行: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL を削除
値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。
レポートの行: not_null_relaxed
DEFAULT '0000-00-00'
デフォルト値なし
実在する日付でないデフォルト値は、架空の日付に置き換えずに省きます。
レポートの行: zero_date_default
TIME
MySQL が書き出すとおりの TIME のテキスト、期間を含む
SQLite は時刻をテキストで保持するため、1 日を超える期間や負の期間も正確に残ります。
YEAR
範囲の CHECK 付きの INTEGER
SQLite には年の型がありません。チェック制約で、MySQL が許可するのと同じ値に限定します。
CHAR(n), VARCHAR(n)
VARCHAR(n)、長さは強制しない
SQLite は宣言された型をツール向けに保持しますが、長さは制限しません。値は MySQL が返すものと同じです。
DATETIME
ISO 8601 のテキストとしての DATETIME
SQLite は日付を、日付関数が読めるテキストとして保存します。
TIMESTAMP
UTC の ISO 8601 テキストとしての TIMESTAMP。ダンプが示すタイムゾーン、示されていなければ UTC
TIMESTAMP はある瞬間を表し、UTC で書き込みます。ダンプには書き出したときのタイムゾーンが示されます (mysqldump は UTC で書き出します)。示されていない場合は UTC として読み込み、レポートにその旨を記載します。
レポートの行: timestamp_zone_assumed
ENUM
値の CHECK 付きの TEXT
チェック制約付きのテキストは同じ値を保ちます。
ENUM holding '' (MySQL's error value)
チェック制約が許可する空の値
緩い SQL モードでは、無効な値が ENUM に入ると MySQL は空文字列を保存します。これらの行は残し、チェック制約でも許可します。
レポートの行: enum_invalid_value
ENUM holding values outside its list
CHECK なし
リストにない値はチェック制約に違反するため、チェック制約は作成しません。
レポートの行: enum_check_skipped
SET
MySQL が書き出すとおりの TEXT ('a,b')
SQLite には配列がありません。テキストは MySQL が返すものと同じです。
JSON
TEXT
SQLite の JSON 関数はテキストから JSON を読みます。JSON と宣言した列では "123" が数値になってしまうため、TEXT にします。
NUL bytes in text
保持
SQLite のテキストは NUL バイトを保持できるため、値はそのままコピーします。
text that isn't valid in its character set
不正なバイトを置換文字に
SQLite のテキストは UTF-8 です。UTF-8 でないバイトは関数が誤って読みます。
レポートの行: invalid_utf8_replaced
text decoded twice (ñ)
そのままコピー
ダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。
レポートの行: mojibake_suspected
AUTO_INCREMENT
INTEGER PRIMARY KEY AUTOINCREMENT、カウンターはコピーした ID の後から
SQLite は整数の主キー全体を採番します。AUTOINCREMENT は MySQL と同様に ID の再利用を防ぎ、カウンターは最大の ID かダンプの AUTO_INCREMENT のうち大きい方の後から続きます。
AUTO_INCREMENT on part of a key or outside one
カウンターなしの INTEGER
SQLite が採番するのは主キー全体である列だけなので、列は値を保ち、新しい行には値を指定する必要があります。
レポートの行: identity_without_counter
ON UPDATE CURRENT_TIMESTAMP
AFTER UPDATE トリガー
行が変更され、更新でその列が設定されなかった場合、MySQL と同様にトリガーが列を現在時刻にします。
レポートの行: on_update_trigger
generated columns
GENERATED ALWAYS AS、ソースと同じ VIRTUAL または STORED
SQLite 3.31 以降は、生成列を同じ 2 つの方式で計算します。
generated columns with functions SQLite lacks
普通の列
SQLite 用に書き換えられない式は、普通の列とレポートの 1 行になります。
レポートの行: generated_not_translated
INVISIBLE columns
通常の列
SQLite には非表示の列がありません。
レポートの行: invisible_column
CHECK constraints
変換して CREATE TABLE 内に記述
SQLite はチェック制約を CREATE TABLE 内でしか受け付けません。
CHECK constraints with functions SQLite lacks
作成しない
SQLite 用に書き換えられないチェック制約は省き、レポートに記載します。
レポートの行: check_skipped
CHECK ... NOT ENFORCED
作成しない
MySQL はこれらのチェック制約を適用せずに保持するため、違反する行がある可能性があります。
レポートの行: check_not_enforced
defaults with functions SQLite lacks
デフォルト値なし
SQLite 用に書き換えられないデフォルト値は省き、レポートに記載します。
レポートの行: default_not_translated
keys and indexes on a prefix, c(20)
substr(c, 1, 20) のインデックス
SQLite は式にインデックスを作れるため、同じ先頭部分にインデックスを作り、一意の先頭部分は一意のままです。
レポートの行: prefix_unique
FULLTEXT indexes
作成しない
SQLite は別の FTS5 テーブルでテキストを検索し、専用のクエリが必要です。
レポートの行: fulltext_not_created
SPATIAL indexes
作成しない
SQLite には列に対する空間インデックスがありません。
レポートの行: spatial_index_not_created
functional indexes SQLite can't write
作成しない
SQLite 用に書き換えられない式のインデックスは省き、レポートに記載します。
レポートの行: index_skipped
foreign keys
CREATE TABLE 内に記述し、チェックせずに読み込んでから PRAGMA foreign_key_check で一覧
SQLite は外部キーを CREATE TABLE 内でしか受け付けず、PRAGMA foreign_keys がオンのときだけチェックします。行は MySQL と同様にチェックせずに読み込み、スクリプトの最後に親のない行を一覧にします。
foreign keys to columns without a unique key
作成しない
SQLite では参照先の列に一意キーが必要ですが、InnoDB では不要です。
レポートの行: foreign_key_skipped
table, index and column names
書かれたとおり。大文字小文字だけが違う場合やインデックス名が重複する場合は名前を変更
SQLite の名前は大文字と小文字を区別せず、インデックス名はデータベースごとに 1 つの名前空間を共有します。
レポートの行: identifier_renamed
GEOMETRY, POINT, POLYGON...
BLOB に WKB
標準の WKB (Well-Known Binary) ですべてのジオメトリを正確に保持します。
レポートの行: geometry_as_blob
INET4, INET6, UUID (MariaDB)
TEXT
SQLite にはこれらの型がありません。テキストは MariaDB が返すものと同じです。
BINARY, VARBINARY, BLOB
BLOB
バイトはバイトのままです。
PARTITION BY
1 つのテーブル
行は同じです。
レポートの行: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
現在の行を持つテーブル
ダンプには現在の行しか含まれません。
レポートの行: system_versioning_dropped
MyISAM, MEMORY and other engines
通常のテーブル
SQLite のテーブルエンジンは 1 つだけです。
レポートの行: engine_dropped
dumps of several databases
1 つのファイル、各テーブルの先頭にデータベース名
SQLite のファイルは 1 つのデータベースなので、データベース名で同じ名前のテーブルを区別します。
レポートの行: databases_merged
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
BLOB に WKB
MySQL のジオメトリ形式を値から認識し、標準の WKB として保存します。
レポートの行: geometry_as_blob
_ci collations
厳密な比較
SQLite は、指定がない限りテキストを厳密に比較します。NOCASE が大文字小文字を同一視するのは ASCII 文字だけです。
レポートの行: case_insensitive_collation
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
TEXT
テキストはどんな値も保持できます。読み込み後に型を変更してください。
レポートの行: unknown_type
values that don't fit their column
NULL
破損したダンプや手書きのダンプには、列が保持できない値が含まれることがあります。それらを NULL にして、残りを読み込みます。
レポートの行: invalid_value_null
unreadable geometries
NULL
ジオメトリでないバイト列は、ジオメトリとして保存できません。
レポートの行: bad_geometry
CREATE SEQUENCE (MariaDB)
作成しない
SQLite にはシーケンスがありません。
レポートの行: sequence_not_converted
VECTOR(n) (MariaDB 11.7+)
浮動小数点数の JSON 配列を持つ TEXT
SQLite には vector 型がありません。JSON 配列はすべての浮動小数点数を保ちます。
レポートの行: type_replaced
| MariaDB では | SQLite では | レポートの行 |
|---|---|---|
| TINYINT(1), BOOL | 値をそのまま持つ INTEGERSQLite には boolean 型がなく、true と false は整数の 1 と 0 なので、すべての値が意味を保ちます。 | |
| UNSIGNED integers | 負でないことを確かめる CHECK 付きの INTEGER。2^63-1 を超える値を持つ BIGINT UNSIGNED は TEXTSQLite の整数は 64 ビットの符号付きです。MySQL と同様にチェック制約で負の値を防ぎ、符号付きの範囲を超える値は桁が失われないようテキストで保持します。 | unsigned_widened |
| ZEROFILL and display widths | 削除ゼロ埋めは数値の表示方法であり、数値の一部ではありません。数値は残ります。ゼロ埋めが必要なら、読み出すときに書式を整えてください。 | zerofill_dropped |
| FLOAT(M,D) | REAL、桁数指定なしSQLite の浮動小数点数には固定の桁数がありません。保存された値はそのままコピーします。 | float_scale_dropped |
| DECIMAL(p,s) | 15 桁までは DECIMAL(p,s)、それを超えると TEXTSQLite の数値が保てる有効桁数は約 15 桁です。それより大きい小数は、すべての桁を正確に保つためテキストで保持します。 | decimal_as_text |
| BIT(1), BIT(n) | ビットの値を持つ INTEGER。BIT(64) は TEXT の数字ビットフィールドは、ビットが表す数値として保存します。BIT(64) の最上位ビットは符号付き整数に収まらないため、その数値はテキストで保持します。 | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLSQLite の日付関数は実在する暦の日付しか読みません。これらは NULL になり、他のどのデータベースと同様に、レポートでその数を示します。 | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL を削除値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。 | not_null_relaxed |
| DEFAULT '0000-00-00' | デフォルト値なし実在する日付でないデフォルト値は、架空の日付に置き換えずに省きます。 | zero_date_default |
| TIME | MySQL が書き出すとおりの TIME のテキスト、期間を含むSQLite は時刻をテキストで保持するため、1 日を超える期間や負の期間も正確に残ります。 | |
| YEAR | 範囲の CHECK 付きの INTEGERSQLite には年の型がありません。チェック制約で、MySQL が許可するのと同じ値に限定します。 | |
| CHAR(n), VARCHAR(n) | VARCHAR(n)、長さは強制しないSQLite は宣言された型をツール向けに保持しますが、長さは制限しません。値は MySQL が返すものと同じです。 | |
| DATETIME | ISO 8601 のテキストとしての DATETIMESQLite は日付を、日付関数が読めるテキストとして保存します。 | |
| TIMESTAMP | UTC の ISO 8601 テキストとしての TIMESTAMP。ダンプが示すタイムゾーン、示されていなければ UTCTIMESTAMP はある瞬間を表し、UTC で書き込みます。ダンプには書き出したときのタイムゾーンが示されます (mysqldump は UTC で書き出します)。示されていない場合は UTC として読み込み、レポートにその旨を記載します。 | timestamp_zone_assumed |
| ENUM | 値の CHECK 付きの TEXTチェック制約付きのテキストは同じ値を保ちます。 | |
| ENUM holding '' (MySQL's error value) | チェック制約が許可する空の値緩い SQL モードでは、無効な値が ENUM に入ると MySQL は空文字列を保存します。これらの行は残し、チェック制約でも許可します。 | enum_invalid_value |
| ENUM holding values outside its list | CHECK なしリストにない値はチェック制約に違反するため、チェック制約は作成しません。 | enum_check_skipped |
| SET | MySQL が書き出すとおりの TEXT ('a,b')SQLite には配列がありません。テキストは MySQL が返すものと同じです。 | |
| JSON | TEXTSQLite の JSON 関数はテキストから JSON を読みます。JSON と宣言した列では "123" が数値になってしまうため、TEXT にします。 | |
| NUL bytes in text | 保持SQLite のテキストは NUL バイトを保持できるため、値はそのままコピーします。 | |
| text that isn't valid in its character set | 不正なバイトを置換文字にSQLite のテキストは UTF-8 です。UTF-8 でないバイトは関数が誤って読みます。 | invalid_utf8_replaced |
| text decoded twice (ñ) | そのままコピーダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。 | mojibake_suspected |
| AUTO_INCREMENT | INTEGER PRIMARY KEY AUTOINCREMENT、カウンターはコピーした ID の後からSQLite は整数の主キー全体を採番します。AUTOINCREMENT は MySQL と同様に ID の再利用を防ぎ、カウンターは最大の ID かダンプの AUTO_INCREMENT のうち大きい方の後から続きます。 | |
| AUTO_INCREMENT on part of a key or outside one | カウンターなしの INTEGERSQLite が採番するのは主キー全体である列だけなので、列は値を保ち、新しい行には値を指定する必要があります。 | identity_without_counter |
| ON UPDATE CURRENT_TIMESTAMP | AFTER UPDATE トリガー行が変更され、更新でその列が設定されなかった場合、MySQL と同様にトリガーが列を現在時刻にします。 | on_update_trigger |
| generated columns | GENERATED ALWAYS AS、ソースと同じ VIRTUAL または STOREDSQLite 3.31 以降は、生成列を同じ 2 つの方式で計算します。 | |
| generated columns with functions SQLite lacks | 普通の列SQLite 用に書き換えられない式は、普通の列とレポートの 1 行になります。 | generated_not_translated |
| INVISIBLE columns | 通常の列SQLite には非表示の列がありません。 | invisible_column |
| CHECK constraints | 変換して CREATE TABLE 内に記述SQLite はチェック制約を CREATE TABLE 内でしか受け付けません。 | |
| CHECK constraints with functions SQLite lacks | 作成しないSQLite 用に書き換えられないチェック制約は省き、レポートに記載します。 | check_skipped |
| CHECK ... NOT ENFORCED | 作成しないMySQL はこれらのチェック制約を適用せずに保持するため、違反する行がある可能性があります。 | check_not_enforced |
| defaults with functions SQLite lacks | デフォルト値なしSQLite 用に書き換えられないデフォルト値は省き、レポートに記載します。 | default_not_translated |
| keys and indexes on a prefix, c(20) | substr(c, 1, 20) のインデックスSQLite は式にインデックスを作れるため、同じ先頭部分にインデックスを作り、一意の先頭部分は一意のままです。 | prefix_unique |
| FULLTEXT indexes | 作成しないSQLite は別の FTS5 テーブルでテキストを検索し、専用のクエリが必要です。 | fulltext_not_created |
| SPATIAL indexes | 作成しないSQLite には列に対する空間インデックスがありません。 | spatial_index_not_created |
| functional indexes SQLite can't write | 作成しないSQLite 用に書き換えられない式のインデックスは省き、レポートに記載します。 | index_skipped |
| foreign keys | CREATE TABLE 内に記述し、チェックせずに読み込んでから PRAGMA foreign_key_check で一覧SQLite は外部キーを CREATE TABLE 内でしか受け付けず、PRAGMA foreign_keys がオンのときだけチェックします。行は MySQL と同様にチェックせずに読み込み、スクリプトの最後に親のない行を一覧にします。 | |
| foreign keys to columns without a unique key | 作成しないSQLite では参照先の列に一意キーが必要ですが、InnoDB では不要です。 | foreign_key_skipped |
| table, index and column names | 書かれたとおり。大文字小文字だけが違う場合やインデックス名が重複する場合は名前を変更SQLite の名前は大文字と小文字を区別せず、インデックス名はデータベースごとに 1 つの名前空間を共有します。 | identifier_renamed |
| GEOMETRY, POINT, POLYGON... | BLOB に WKB標準の WKB (Well-Known Binary) ですべてのジオメトリを正確に保持します。 | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | TEXTSQLite にはこれらの型がありません。テキストは MariaDB が返すものと同じです。 | |
| BINARY, VARBINARY, BLOB | BLOBバイトはバイトのままです。 | |
| PARTITION BY | 1 つのテーブル行は同じです。 | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | 現在の行を持つテーブルダンプには現在の行しか含まれません。 | system_versioning_dropped |
| MyISAM, MEMORY and other engines | 通常のテーブルSQLite のテーブルエンジンは 1 つだけです。 | engine_dropped |
| dumps of several databases | 1 つのファイル、各テーブルの先頭にデータベース名SQLite のファイルは 1 つのデータベースなので、データベース名で同じ名前のテーブルを区別します。 | databases_merged |
| 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 | BLOB に WKBMySQL のジオメトリ形式を値から認識し、標準の WKB として保存します。 | geometry_as_blob |
| _ci collations | 厳密な比較SQLite は、指定がない限りテキストを厳密に比較します。NOCASE が大文字小文字を同一視するのは ASCII 文字だけです。 | case_insensitive_collation |
| 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 | TEXTテキストはどんな値も保持できます。読み込み後に型を変更してください。 | unknown_type |
| values that don't fit their column | NULL破損したダンプや手書きのダンプには、列が保持できない値が含まれることがあります。それらを NULL にして、残りを読み込みます。 | invalid_value_null |
| unreadable geometries | NULLジオメトリでないバイト列は、ジオメトリとして保存できません。 | bad_geometry |
| CREATE SEQUENCE (MariaDB) | 作成しないSQLite にはシーケンスがありません。 | sequence_not_converted |
| VECTOR(n) (MariaDB 11.7+) | 浮動小数点数の JSON 配列を持つ TEXTSQLite には vector 型がありません。JSON 配列はすべての浮動小数点数を保ちます。 | type_replaced |
スクリプトを SQLite に読み込む
スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。
sqlite3 -bail mydb.sqlite < mariadb.sqlite.sql外部キーは各テーブル内で宣言し、行は外部キーのチェックをオフにして読み込みます。その後、途中で失敗する代わりに、存在しない行を参照している行をスクリプトが一覧にします。
大きなダンプは、ローカルディスク上の新しいファイルに読み込んでください。スクリプトは同期をオフにした 1 つのトランザクションですべてを読み込むため、ディスクの速度で動き、途中で止まっても中途半端なテーブルは残りません。
コマンドラインなら、ファイルを SQLite データベースに直接読み込めます。スクリプトを書き出す必要はなく、無料です。
MariaDB を最適な方法でダンプする
コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。
- --default-character-set=utf8mb4 を使うと、絵文字などの 4 バイト文字が保たれます。utf8mb3 のダンプでは、コンバーターに届く前にこれらが失われます。
- --hex-blob はバイナリ列と VECTOR の値を 16 進数で書き出すため、システム間でコピーしても壊れません。
- --routines --triggers --events を使うとこれらのオブジェクトがダンプに含まれ、レポートで一覧できます。
変換されないもの
ビュー、トリガー、ストアドプロシージャ、関数、イベントは MariaDB 独自の言語で書かれています。黙って削除することはなく、レポートに名前で一覧するので、SQLite 向けに書き直せます。
MariaDB から SQLite への変換に関する質問
ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ
ダンプはアップロードされますか?
いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。
ダンプはどのくらいの大きさまで扱えますか?
コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 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 と INET の列は text、JSON は text、VECTOR は浮動小数点数の JSON 配列になります。ゼロ日付は NULL になり、レポートで件数を示します。
AUTO_INCREMENT の値とシーケンスは保持されますか?
テーブルの主キー全体である AUTO_INCREMENT 列は INTEGER PRIMARY KEY AUTOINCREMENT になり、最大の ID の後から続きます。SQLite にはシーケンスがないため、シーケンスはレポートに記載されます。
ストアドプロシージャとトリガーはどうなりますか?
データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。
スクリプトはどの SQLite バージョンで読み込めますか?
SQLite 3.31 以降です。すべてのテスト用ダンプを 3.31 と 3.54 で読み込み、問題があれば最初のエラーで止まります。