Все статьи
Форматы данных

CSV в SQL INSERT: импорт данных в базу

Преобразование CSV в SQL INSERT statements, типы данных, обработка NULL, пакетный импорт.

20 июня 2025
8 мин чтения
ConvertHub
Обновлено 07.09.2026
#csv#sql#база данных

Нужен прямо сейчас? Инструмент для этой задачи:

Введение

Импорт данных из CSV в реляционную базу — классическая задача при миграциях, переносе данных из Excel и загрузке выгрузок от партнёров. Многие СУБД предлагают встроенные средства (LOAD DATA INFILE в MySQL, COPY в PostgreSQL,BULK INSERT в SQL Server), но не всегда есть доступ к серверу или права на эти команды. В таких случаях выручает генерация SQL INSERT-запросов из CSV. В этой статье разберём, как устроена конвертация CSV в SQL INSERT, какие бывают подводные камни и как автоматизировать процесс.

Зачем генерировать SQL INSERT

У генерации INSERT-запросов из CSV есть несколько типичных сценариев:

  • Импорт в базы через веб-интерфейс — phpMyAdmin, DBeaver, Adminer принимают SQL-скрипты, но не CSV.
  • Миграции с двумя бэкендами — когда данные выгружены из одной системы в CSV и должны попасть в другую через SQL.
  • Тестовые данные — для fixtures и seed-данных удобно иметь SQL-скрипт, который выполняется на любой СУБД.
  • Shared-хостинг без file-доступа — на дешёвых хостингах часто нет прав на LOAD DATA INFILE.
  • Деплой через миграции — SQL-скрипт можно положить в Git рядом с миграциями схемы.

Структура CSV для импорта

Для генерации SQL CSV должен иметь строку заголовков: имена колонок станут именами полей в INSERT. Пример:

id,name,email,age,active
1,Анна Иванова,anna@example.com,32,true
2,Борис Петров,boris@example.com,45,false
3,Вера Сидорова,vera@example.com,28,true

Из этого CSV генератор создаст три INSERT-запроса:

INSERT INTO users (id, name, email, age, active)
VALUES (1, 'Анна Иванова', 'anna@example.com', 32, TRUE);

INSERT INTO users (id, name, email, age, active)
VALUES (2, 'Борис Петров', 'boris@example.com', 45, FALSE);

INSERT INTO users (id, name, email, age, active)
VALUES (3, 'Вера Сидорова', 'vera@example.com', 28, TRUE);

Типы данных и экранирование

Главная сложность при генерации SQL — корректная обработка типов. В CSV все значения строки, а в SQL строки должны быть в одинарных кавычках, числа без кавычек, даты в формате 'YYYY-MM-DD', а NULL без кавычек. Хороший конвертер различает типы автоматически или по схеме.

Тип данныхЗапись в SQLПример
Целое числобез кавычек42
Дробноебез кавычек3.14
Строкаодинарные кавычки'Привет'
Датаодинарные кавычки'2025-01-30'
Booleanзависит от СУБДTRUE / 1
NULLбез кавычекNULL

Экранирование кавычек

Если в строковом поле встречается одинарная кавычка (например, фамилия «О'Брайен»), её нужно удвоить: 'О''Брайен'. Наивная конкатенация строк приведёт к синтаксической ошибке или, что хуже, к SQL-инъекции. Серьёзные конвертеры всегда выполняют экранирование, а также обрабатывают другие спецсимволы.

NULL vs пустая строка

Пустое поле в CSV может означать как NULL, так и пустую строку ''. В SQL это разные значения. Хороший конвертер позволяет настроить интерпретацию: либо все пустые поля превращать в NULL, либо в '', либо использовать специальный маркер (например, \N).

Выбор диалекта SQL

СУБД различаются в мелочах: булевы литералы, экранирование, синтаксис множественных вставок. Универсальный SQL-скрипт не всегда работает везде.

СУБДBooleanМножественный INSERT
PostgreSQLTRUE / FALSEVALUES (...), (...)
MySQLTRUE / FALSE или 1 / 0VALUES (...), (...)
SQLite1 / 0VALUES (...), (...)
SQL Server1 / 0VALUES (...), (...)
OracleНет булева типаINSERT ALL ...

Для массового импорта удобнее использовать множественный INSERT с однимVALUES — он выполняется быстрее, чем отдельные INSERT на каждую строку. Однако у некоторых СУБД есть ограничение на количество строк в одном запросе (у SQLite — 1000, у SQL Server — 1000 значений в VALUES).

Пример: множественный INSERT

INSERT INTO users (id, name, email, age, active) VALUES
  (1, 'Анна Иванова', 'anna@example.com', 32, TRUE),
  (2, 'Борис Петров', 'boris@example.com', 45, FALSE),
  (3, 'Вера Сидорова', 'vera@example.com', 28, TRUE);

Для больших файлов генератор должен разбивать данные на батчи по 100–1000 строк, чтобы не упереться в лимиты СУБД и не превысить размер пакета (max_allowed_packetв MySQL).

Инструменты конвертации

Онлайн-конвертер

Самый быстрый способ сгенерировать SQL из CSV — наш инструментCSV в SQL. Он работает локально в браузере, поддерживает выбор диалекта СУБД, режимы single/multi INSERT, обработку NULL и экранирование. Просто вставьте CSV, настройте параметры и скопируйте готовый SQL.

Встроенные средства СУБД

Если у вас есть доступ к серверу БД, эффективнее использовать нативные команды:

-- PostgreSQL
\COPY users FROM 'users.csv' WITH (FORMAT csv, HEADER true);

-- MySQL
LOAD DATA INFILE '/var/lib/mysql-files/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

-- SQLite
.import --csv --skip 1 users.csv users

Эти команды работают в десятки раз быстрее INSERT-запросов, поскольку минуют парсер SQL. Но они требуют доступа к файловой системе сервера и прав администратора.

Программная генерация

Простой скрипт на Python с библиотекой csv:

import csv

def escape(value: str) -> str:
    if value == "":
        return "NULL"
    if value.replace(".", "").isdigit():
        return value
    return "'" + value.replace("'", "''") + "'"

with open("users.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    header = next(reader)
    columns = ", ".join(header)
    for row in reader:
        values = ", ".join(escape(v) for v in row)
        print(f"INSERT INTO users ({columns}) VALUES ({values});")

Обработка больших файлов

При импорте сотен тысяч строк генерация SQL-файла в памяти приведёт к переполнению. Решение — потоковая генерация: читаем CSV построчно, пишем SQL построчно. Батчирование в 500 строк на один INSERT оптимально для большинства СУБД. Перед импортом больших объёмов отключите индексы и триггеры, а после — пересоздайте их. В MySQL помогает SET autocommit=0 и один COMMIT в конце — это ускоряет вставку на порядок.

Безопасность и инъекции

При генерации SQL из недоверенных CSV-файлов критически важно корректное экранирование. Одной необработанной кавычки достаточно, чтобы превратитьINSERT в инъекцию. Правила:

  • Все строковые значения заключайте в одинарные кавычки.
  • Каждую одинарную кавычку внутри значения удваивайте.
  • Не используйте конкатенацию строк напрямую — применяйте параметризованные запросы при вставке в БД.
  • Проверяйте числовые значения на соответствие формату перед вставкой без кавычек.
  • Для булевых полей принимайте только true/false, остальное считайте ошибкой.

Лучшие практики

  • Перед импортом создавайте временную таблицу и импортируйте в неё — так можно проверить данные без влияния на продакшн.
  • Используйте транзакции, чтобы откатить импорт в случае ошибки.
  • Валидируйте CSV перед импортом: проверяйте количество колонок, типы данных, кодировку.
  • Документируйте соответствие колонок CSV и полей таблицы — это поможет коллегам.
  • Для регулярных импортов лучше написать ETL-процесс с использованием нативных команд СУБД.
  • Если данных много, генерируйте SQL батчами по 500–1000 строк, а не одним гигантским файлом.

Альтернативы

Если ваша конечная цель — не SQL, а анализ данных, рассмотрите конвертациюCSV в JSON: JSON удобнее для JavaScript-приложений и NoSQL-баз. Для табличных расчётов в Excel есть обратная конвертация в CSV через тот же формат, а для парсинга HTML-таблиц в CSV — отдельнаястатья.

Заключение

Конвертация CSV в SQL INSERT — простой и универсальный способ импортировать табличные данные в реляционную базу без специальных прав. Главное — корректно обрабатывать типы данных, экранировать спецсимволы и выбирать подходящий диалект SQL. Для разовых задач используйте онлайн-конвертер ConvertHub, для регулярных — встроенные средства СУБД или ETL-инструменты. При работе с большими объёмами не забывайте про батчирование, транзакции и временное отключение индексов — это сэкономит часы на импорте.

Попробуйте эти инструменты

Похожие статьи