本文へスキップ
IntoSQL ホーム

MySQL を SQLite に変換

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

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

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

表示

shop_2024.sql のテーブルMySQL 8.0.46 のダンプ · mysqldump で作成 · utf8mb4

  • customers8 行3
    7 列
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(150) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATE
    created_atTIMESTAMP not null
  • orders10 行5
    9 列
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteVARCHAR(255)
    updated_atTIMESTAMP 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,
    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),
    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) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17'),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00'),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59'),
(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, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','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','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"','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,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','2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','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)
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;

修正

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

確認が必要

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

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

その他のサンプル:

MySQL から 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

MySQL では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 NULLNOT NULL を削除値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
DEFAULT '0000-00-00'デフォルト値なし実在する日付でないデフォルト値は、架空の日付に置き換えずに省きます。zero_date_default
TIMEMySQL が書き出すとおりの TIME のテキスト、期間を含むSQLite は時刻をテキストで保持するため、1 日を超える期間や負の期間も正確に残ります。
YEAR範囲の CHECK 付きの INTEGERSQLite には年の型がありません。チェック制約で、MySQL が許可するのと同じ値に限定します。
CHAR(n), VARCHAR(n)VARCHAR(n)、長さは強制しないSQLite は宣言された型をツール向けに保持しますが、長さは制限しません。値は MySQL が返すものと同じです。
DATETIMEISO 8601 のテキストとしての DATETIMESQLite は日付を、日付関数が読めるテキストとして保存します。
TIMESTAMPUTC の 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 listCHECK なしリストにない値はチェック制約に違反するため、チェック制約は作成しません。enum_check_skipped
SETMySQL が書き出すとおりの TEXT ('a,b')SQLite には配列がありません。テキストは MySQL が返すものと同じです。
JSONTEXTSQLite の 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_INCREMENTINTEGER 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_TIMESTAMPAFTER UPDATE トリガー行が変更され、更新でその列が設定されなかった場合、MySQL と同様にトリガーが列を現在時刻にします。on_update_trigger
generated columnsGENERATED 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 keysCREATE 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, BLOBBLOBバイトはバイトのままです。
PARTITION BY1 つのテーブル行は同じです。partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)現在の行を持つテーブルダンプには現在の行しか含まれません。system_versioning_dropped
MyISAM, MEMORY and other engines通常のテーブルSQLite のテーブルエンジンは 1 つだけです。engine_dropped
dumps of several databases1 つのファイル、各テーブルの先頭にデータベース名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 TABLEBLOB に 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-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 knowTEXTテキストはどんな値も保持できます。読み込み後に型を変更してください。unknown_type
values that don't fit their columnNULL破損したダンプや手書きのダンプには、列が保持できない値が含まれることがあります。それらを NULL にして、残りを読み込みます。invalid_value_null
unreadable geometriesNULLジオメトリでないバイト列は、ジオメトリとして保存できません。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 < mysql.sqlite.sql

外部キーは各テーブル内で宣言し、行は外部キーのチェックをオフにして読み込みます。その後、途中で失敗する代わりに、存在しない行を参照している行をスクリプトが一覧にします。

大きなダンプは、ローカルディスク上の新しいファイルに読み込んでください。スクリプトは同期をオフにした 1 つのトランザクションですべてを読み込むため、ディスクの速度で動き、途中で止まっても中途半端なテーブルは残りません。

コマンドラインなら、ファイルを SQLite データベースに直接読み込めます。スクリプトを書き出す必要はなく、無料です。

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

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

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

変換されないもの

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

MySQL から SQLite への変換に関する質問

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

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

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

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

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

MariaDB のダンプも読み込めますか?

はい。mariadb-dump や MariaDB 10.3 から 12 のダンプも同じ方法で変換されます。MariaDB の INET6、INET4、UUID 列も対象です。

0000-00-00 の日付はどうなりますか?

NULL になります。SQLite はテキストのまま保存できますが、0000-00-00 を日付として読むものはありません。各列にいくつあったかはレポートに記載されます。

AUTO_INCREMENT の値は保持されますか?

はい。テーブルの主キー全体である AUTO_INCREMENT 列は INTEGER PRIMARY KEY AUTOINCREMENT になり、すべての行が ID を保ち、次の ID は最大の ID の後から続きます。それ以外の AUTO_INCREMENT 列はカウンターなしで値を保ち、レポートにその旨が書かれます。

TINYINT(1) は boolean になりますか?

いいえ。SQLite には boolean 型がないため、TINYINT(1) は INTEGER になり、すべての値はそのままです。

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

データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。例外は ON UPDATE CURRENT_TIMESTAMP で、SQLite のトリガーになります。

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

SQLite 3.31 以降です。すべてのテスト用ダンプを 3.31 と 3.54 で読み込み、問題があれば最初のエラーで止まります。