Конвертация SQLite в SQL Server
Перетащите файл базы данных SQLite (.db, .sqlite, .sqlite3) или SQL, который пишет .dump в sqlite3, и скачайте скрипт SQL Server с теми же таблицами, ключами, индексами и данными. Каждый столбец получает тип, в который помещаются его значения, а каждое значение, которое SQL Server не может хранить как есть, указано в отчете.
18 строк конвертировано, без исправлений, ни одна не отклонена
Таблицы в shop_2024_sqlite.sqlДамп SQLite · создан программой sqlite3 · utf-8
customers8 строк
7 столбцов id bigint not null name nvarchar(max) not null email nvarchar(450) not null country nvarchar(max) not null is_active bit not null signed_up date created_at datetime2(0) not null orders10 строк
9 столбцов id bigint not null customer_id bigint not null status nvarchar(450) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(max) receipt varbinary(max)
Не конвертировано
- Представление order_totals
- Триггер orders_shipped
Каждая база данных пишет их на своем языке. Перепишите их для SQL Server.
-- Written by IntoSQL from a SQLite 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 TABLE [dbo].[customers] (
[id] bigint IDENTITY(9, 1) NOT NULL,
[name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
[email] nvarchar(450) COLLATE Latin1_General_100_CI_AS_SC NOT NULL,
[country] nvarchar(max) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
[is_active] bit DEFAULT 1 NOT NULL,
[signed_up] date NULL,
[created_at] datetime2(0) DEFAULT SYSDATETIME() NOT NULL,
CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO
CREATE TABLE [dbo].[orders] (
[id] bigint IDENTITY(11, 1) NOT NULL,
[customer_id] bigint NOT NULL,
[status] nvarchar(450) COLLATE Latin1_General_100_BIN2 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(max) COLLATE Latin1_General_100_BIN2 NULL,
[receipt] varbinary(max) NULL,
CONSTRAINT [check1] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
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]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12');
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], [receipt]) VALUES
(1,1,N'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(2,2,N'paid',54,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(3,1,N'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(4,4,N'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',0x25504446);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,CAST(N'' AS nvarchar(max))+N'Leave at the door;'+NCHAR(10)+N'ring twice',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(6,6,N'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(7,8,N'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(8,2,N'paid',19.99,1,'2024-03-12 08:00:00',NULL,N'Paid at the counter',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(9,3,N'shipped',64,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(10,7,N'paid',1499,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [FK_orders] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]) ON DELETE CASCADE;
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [FK_orders]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[FK_orders]' + 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 < 8 SET @next = 8; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 10 SET @next = 10; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
Исправления
Исправлять ничего не пришлось.
Требует проверки
- Не конвертированы представления, триггеры, процедуры и события (2 объекта); отчет перечисляет каждый. Создайте их заново вручную в SQL Server.
- Проверку check1 таблицы customers нельзя записать для SQL Server (function char_length), поэтому она не создана. Запишите проверку вручную, если она важна.
Файл конвертируется на этом компьютере и никуда не загружается.
Другие примеры:
Что меняется при переходе с SQLite на SQL Server
Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
тип, в который помещается каждое значение столбца
SQLite хранит любое значение в любом столбце, поэтому объявленный тип - лишь подсказка: каждый столбец получает тип, в который помещаются все его значения, а столбец со смешанными значениями сохраняет их текст.
BOOLEAN, BOOL
bit
Если каждое значение равно 0 или 1; столбец, где есть и другие значения, сохраняет их как числа или текст.
TEXT, VARCHAR(n), CHAR(n), CLOB
nvarchar(n) или nvarchar(max)
SQLite никогда не ограничивает длину; объявленная длина сохраняется, только если в нее помещается каждое значение.
DECIMAL(p,s), NUMERIC
точный тип, если в него помещается каждое значение, иначе double
SQLite хранит их как целые числа или double; объявленная точность сохраняется, только если значения в нее помещаются.
BLOB, and columns holding bytes
varbinary(max)
Байты остаются байтами; текст и числа в том же столбце сохраняются как их байты.
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
date, datetime2(p)
Если каждое значение - дата или дата со временем; числа epoch и другой текст сохраняют свои значения как есть.
JSON holding JSON text
nvarchar(max)
Если каждое значение - объект или массив JSON.
Infinity in REAL columns
NULL
В double в SQL Server нет бесконечности, поэтому такие значения становятся NULL, а отчет их подсчитывает.
Строка отчета: invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENT
IDENTITY, продолжается после наибольшего id или значения sqlite_sequence
Только столбец, объявленный ровно как INTEGER PRIMARY KEY, является rowid; каждая строка сохраняет свой id, а счетчик начинается после наибольшего когда-либо выданного id.
COLLATE NOCASE
сопоставление без учета регистра
Обычная сортировка SQL Server не учитывает регистр для каждого столбца, как NOCASE делал это для букв ASCII.
generated columns
вычисляемые столбцы, PERSISTED при STORED
SQL Server вычисляет их так же.
generated columns with functions IntoSQL doesn't write, and the || operator
обычный столбец
Формула, которую нельзя записать, оставляет обычный столбец и строку в отчете; в дампе нет значений для генерируемых столбцов.
Строка отчета: 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)
после данных WITH NOCHECK, затем проверка
SQLite проверяет внешние ключи, только если это включено, поэтому строки без родителя встречаются часто: они загружаются, а ключ остается непроверенным с предупреждением, вместо того чтобы остановить загрузку.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server отклоняет каскады, которые могут дойти до таблицы дважды.
Строка отчета: foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)
nvarchar(2n) или nvarchar(max) свыше 4000
nvarchar считает единицы UTF-16, а эмодзи занимает две, поэтому столбец получает место для каждого значения.
Строка отчета: text_length_widened
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 | В SQL Server | Строка отчета |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | тип, в который помещается каждое значение столбцаSQLite хранит любое значение в любом столбце, поэтому объявленный тип - лишь подсказка: каждый столбец получает тип, в который помещаются все его значения, а столбец со смешанными значениями сохраняет их текст. | |
| BOOLEAN, BOOL | bitЕсли каждое значение равно 0 или 1; столбец, где есть и другие значения, сохраняет их как числа или текст. | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | nvarchar(n) или nvarchar(max)SQLite никогда не ограничивает длину; объявленная длина сохраняется, только если в нее помещается каждое значение. | |
| DECIMAL(p,s), NUMERIC | точный тип, если в него помещается каждое значение, иначе doubleSQLite хранит их как целые числа или double; объявленная точность сохраняется, только если значения в нее помещаются. | |
| BLOB, and columns holding bytes | varbinary(max)Байты остаются байтами; текст и числа в том же столбце сохраняются как их байты. | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date, datetime2(p)Если каждое значение - дата или дата со временем; числа epoch и другой текст сохраняют свои значения как есть. | |
| JSON holding JSON text | nvarchar(max)Если каждое значение - объект или массив JSON. | |
| Infinity in REAL columns | NULLВ double в SQL Server нет бесконечности, поэтому такие значения становятся NULL, а отчет их подсчитывает. | invalid_value_null |
| INTEGER PRIMARY KEY, AUTOINCREMENT | IDENTITY, продолжается после наибольшего id или значения sqlite_sequenceТолько столбец, объявленный ровно как INTEGER PRIMARY KEY, является rowid; каждая строка сохраняет свой id, а счетчик начинается после наибольшего когда-либо выданного id. | |
| COLLATE NOCASE | сопоставление без учета регистраОбычная сортировка SQL Server не учитывает регистр для каждого столбца, как NOCASE делал это для букв ASCII. | |
| generated columns | вычисляемые столбцы, PERSISTED при STOREDSQL Server вычисляет их так же. | |
| generated columns with functions IntoSQL doesn't write, and the || operator | обычный столбецФормула, которую нельзя записать, оставляет обычный столбец и строку в отчете; в дампе нет значений для генерируемых столбцов. | 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) | после данных WITH NOCHECK, затем проверкаSQLite проверяет внешние ключи, только если это включено, поэтому строки без родителя встречаются часто: они загружаются, а ключ остается непроверенным с предупреждением, вместо того чтобы остановить загрузку. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server отклоняет каскады, которые могут дойти до таблицы дважды. | foreign_key_action_dropped |
| VARCHAR(n) holding characters past U+FFFF (emoji) | nvarchar(2n) или nvarchar(max) свыше 4000nvarchar считает единицы UTF-16, а эмодзи занимает две, поэтому столбец получает место для каждого значения. | text_length_widened |
| 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 |
Загрузите скрипт в SQL Server
Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.
sqlcmd -b -f 65001 -S localhost -d mydb -i sqlite.sql_server.sqlВнешние ключи добавляются WITH NOCHECK, а затем проверяются. Если строка ссылается на несуществующую строку, скрипт сообщает, какое это ограничение, и оставляет его непроверенным, а не прерывается на полпути.
Для большого дампа запускайте sqlcmd на той же машине, где работает сервер. Каждый пакет до 1000 строк фиксируется отдельно, поэтому журнал транзакций остается небольшим.
Как создать дамп SQLite для лучшего результата
Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:
- Сам файл базы данных конвертируется как есть и читается в браузере страница за страницей. Сначала закройте приложение, которое в него пишет, чтобы ни одно изменение не осталось в его файле -wal.
- sqlite3 app.db .dump > app.sql записывает ту же базу данных в SQL, который тоже конвертируется, в формате .sql или .sql.gz.
- DB Browser for SQLite пишет этот SQL через File, Export, Database to SQL file, как и iterdump() в Python.
Что не конвертируется
Представления и триггеры написаны на собственном языке SQLite. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для SQL Server. Виртуальные таблицы, такие как FTS5 и R*Tree, тоже перечислены, а их служебные таблицы пропускаются.
Вопросы о SQLite в SQL Server
Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов
Мой дамп загружается на сервер?
Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.
Насколько большим может быть дамп?
Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.
Можно ли конвертировать сам файл .db?
Да. Перетащите файл .db, .sqlite или .sqlite3: он читается в браузере и никуда не загружается. Текст с символами NUL и все цифры значения double приходят такими, как хранятся, а .dump может их обрезать.
Из каких версий SQLite может быть дамп?
Файлы баз данных SQLite начиная с 3.0, в UTF-8 или UTF-16, и дампы из .dump оболочки sqlite3 или из iterdump() в Python. Каждый тестовый файл и дамп создан в sqlite3 с 3.31 по 3.54, включая таблицы STRICT и WITHOUT ROWID, и сверен с источником ячейка за ячейкой.
Как определяются типы столбцов, если SQLite их не соблюдает?
Объявленный тип - лишь подсказка, а решают значения: столбец становится bigint, decimal, float, date, datetime2, bit, varbinary или nvarchar, если в него помещается каждое значение. Текст сравнивается точно, как в SQLite, а COLLATE NOCASE - без учета регистра.
Сохраняются ли INTEGER PRIMARY KEY и AUTOINCREMENT?
Да. INTEGER PRIMARY KEY становится столбцом IDENTITY, каждая строка сохраняет свой id, а следующий id идет после наибольшего или, при AUTOINCREMENT, после значения sqlite_sequence.
А представления и триггеры?
Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.
На каких версиях SQL Server загружается скрипт?
SQL Server с 2017 по 2025. Один и тот же скрипт загружается на каждой из них и останавливается на первой ошибке, если что-то пойдет не так.