Как импортировать CSV файл в таблицу MySQL
CSV импортируется в таблицу MySQL тремя способами: командой LOAD DATA INFILE, командой LOAD DATA LOCAL INFILE и мастером импорта в MySQL Workbench. Если в переменной secure_file_priv задан каталог, первый способ читает файлы из этого каталога. Второй способ требует включенного local_infile.
Что подготовить перед импортом
Оператор LOAD DATA INFILE читает текстовый файл и очень быстро загружает его в таблицу.
Перед запуском подготовьте три вещи.
- Таблицу, в которую попадут данные.
- CSV-файл, где число столбцов и формат данных совпадают с таблицей.
- Учетную запись MySQL с привилегиями
FILEиINSERT.
Для примеров возьмем таблицу discounts с четырьмя столбцами. Ее создает такой запрос:
CREATE TABLE discounts (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
expired_date DATE NOT NULL,
amount DECIMAL(10,2) NULL,
PRIMARY KEY (id)
);
Файл discounts.csv хранит в первой строке заголовки столбцов, в следующих трех – данные. Содержимое файла такое:
id,title,expired_date,amount
1,"Весенняя распродажа",2026-04-30,10.00
2,"Скидка новым клиентам",2026-06-15,5.50
3,"Летний промокод",2026-08-31,7.00Импорт файла через LOAD DATA INFILE
Начиная с MySQL 5.7.6 переменная secure_file_priv по умолчанию ограничивает каталог для файлов импорта.
Если файл лежит вне этого каталога, запрос завершается ошибкой ER_OPTION_PREVENTS_STATEMENT со ссылкой на --secure-file-priv.
Узнайте значение переменной запросом:
SHOW VARIABLES LIKE 'secure_file_priv';Если в столбце Value стоит путь, положите discounts.csv в этот каталог. Если Value пустое, ограничения нет. Если там NULL, импорт файлов с сервера запрещен, поэтому берите LOAD DATA LOCAL INFILE.
Подставьте свой путь в запрос. В примере стоит c:\tmp\discounts.csv.
LOAD DATA INFILE 'c:/tmp/discounts.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;В строках MySQL путь пишут с прямыми слэшами. Обратные слэши удваивают: 'c:\\tmp\\discounts.csv'.
Опция FIELDS TERMINATED BY ',' задает запятую разделителем полей.
Опция ENCLOSED BY '"' разрешает обрамлять значение поля двойными кавычками. Запятая внутри такого значения не разделяет поля.
Опция LINES TERMINATED BY '\n' завершает каждую строку файла символом новой строки.
Первая строка содержит заголовки, и ее не нужно загружать, поэтому IGNORE 1 ROWS пропускает одну строку.
Кодировка и разделитель CSV из Excel
Excel в русской локали сохраняет CSV с разделителем «;» и в кодировке cp1251. Запрос с запятой и без указания кодировки такой файл разберет неверно: поля склеятся, а русский текст превратится в набор нечитаемых символов.
Укажите кодировку файла в CHARACTER SET и поменяйте разделитель.
Файлы из Windows часто завершают строки парой символов \r\n.
LOAD DATA INFILE 'c:/tmp/discounts.csv'
INTO TABLE discounts
CHARACTER SET cp1251
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;Для файла в UTF-8 напишите CHARACTER SET utf8mb4.
Если UTF-8 сохранен с BOM, служебный символ попадает в начало первого значения файла. Заголовок с BOM пропустит IGNORE 1 ROWS, а файл без заголовка сохраните в UTF-8 без BOM.
Преобразование даты при импорте
Иногда формат данных не совпадает со столбцами таблицы. В простых случаях его преобразует условие SET в операторе LOAD DATA INFILE.
Допустим, файл discounts_2.csv хранит срок действия скидки в формате мм/дд/гггг, а в таблице столбец DATE.
Три поля файла не покрывают все четыре столбца таблицы, поэтому перечислите столбцы в скобках. Значение даты сначала попадает в переменную @expired_date.
title,expired_date,amount
"Весенняя распродажа",04/30/2026,10.00
"Скидка новым клиентам",06/15/2026,5.50
"Летний промокод",08/31/2026,7.00Функция STR_TO_DATE() превращает эту строку в дату MySQL:
LOAD DATA INFILE 'c:/tmp/discounts_2.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(title,@expired_date,amount)
SET expired_date = STR_TO_DATE(@expired_date, '%m/%d/%Y');Импорт с локального компьютера на удаленный сервер MySQL
Опция LOCAL позволяет загрузить файл с вашего компьютера на удаленный сервер MySQL. Клиентская программа читает файл на вашей стороне и отправляет его серверу.
LOAD DATA LOCAL INFILE 'c:/tmp/discounts.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;Запрос отличается от прежнего только словом LOCAL.
Привилегия FILE с опцией LOCAL не нужна.
В MySQL 8.0 загрузка локальных файлов выключена по умолчанию и на сервере, и на клиенте. Без настройки запрос вернет ошибку «Loading local data is disabled».
Включите переменную на сервере командой SET GLOBAL local_infile = 1; и запустите клиент с ключом --local-infile=1.
Команде SET GLOBAL нужны административные права на сервере. Если их нет, как на большинстве хостингов, положите файл в каталог из secure_file_priv или возьмите другой способ из таблицы ниже.
У LOAD DATA LOCAL есть угроза безопасности. Вредоносный или взломанный сервер может потребовать у клиента любой файл, который клиент вправе прочитать.
Подключайтесь с этой опцией только к серверам, которым доверяете.
Импорт CSV через MySQL Workbench
В MySQL Workbench импорт CSV идет через мастер Table Data Import Wizard. Он избавляет от ручной записи запроса: кодировку, разделитель и соответствие столбцов вы выбираете в окнах мастера.
- В навигаторе Workbench найдите схему и откройте список ее таблиц.
- Щелкните таблицу discounts правой кнопкой мыши и выберите «Table Data Import Wizard».
- Укажите CSV файл, выберите существующую таблицу discounts и нажмите «Next».
- Выберите кодировку файла и разделитель полей, которые соответствуют вашему файлу, и нажмите «Next».
- Сопоставьте столбцы файла со столбцами таблицы, нажмите «Next» и запустите импорт. На последнем шаге мастер покажет ход импорта и сообщение о его завершении.
- Выполните
SELECT * FROM discounts;. Загруженные строки появятся в результатах запроса.
Какой способ выбрать
| Способ | Где лежит файл | Привилегии | Ограничения |
|---|---|---|---|
| LOAD DATA INFILE | На сервере, в каталоге из secure_file_priv | FILE и INSERT | Файл нужно положить на сервер |
| LOAD DATA LOCAL INFILE | На вашем компьютере | INSERT, FILE не нужна | Нужен local_infile на сервере и клиенте |
| MySQL Workbench | На вашем компьютере | INSERT | Нужен установленный Workbench |
Если файл уже лежит на сервере, берите LOAD DATA INFILE.
Если файл на вашем компьютере, а сервер удаленный, берите LOCAL или Workbench. Эти же способы подходят, когда у учетной записи нет привилегии FILE.
Workbench удобнее, когда колонок много и их нужно сопоставлять вручную.
Типичные ошибки при импорте
Ошибки при импорте обычно связаны с несовпадением данных и структуры таблицы либо с уже существующими записями. По тексту сообщения и ситуации с ключами можно понять, нужно ли проверить типы и длину значений, сопоставление полей или правила обработки дублей.
Data truncated for column
Предупреждение значит, что значение не подошло столбцу по типу или длине.
Выполните SHOW WARNINGS; сразу после импорта: MySQL назовет столбец и номер строки. Затем проверьте длину текста и тип значения в этом столбце.
Число полей не совпадает с числом столбцов
Если в файле меньше полей, чем в таблице, перечислите нужные столбцы в скобках после IGNORE 1 ROWS, например (title,expired_date,amount). Так вы сами указываете, какой столбец получает какое поле.
Остальные столбцы получат значения по умолчанию, а id с AUTO_INCREMENT получит следующий номер.
Дубли по первичному ключу
Если строка с таким первичным ключом уже есть, обычный LOAD DATA INFILE останавливается с ошибкой. С опцией LOCAL такие строки по умолчанию пропускаются.
Слово IGNORE перед INTO TABLE пропускает такие строки, слово REPLACE заменяет старые записи новыми.
LOAD DATA INFILE 'c:/tmp/discounts.csv'
REPLACE
INTO TABLE discounts
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;Как проверить результат импорта
Сначала выполните SHOW WARNINGS; сразу после LOAD DATA. Пустой ответ значит, что MySQL не нашел проблем.
Затем сверьте число строк. Запрос SELECT COUNT(*) FROM discounts; должен вернуть столько записей, сколько строк в файле без заголовка. Для файла из примера это 3.
Наконец, просмотрите сами записи запросом SELECT * FROM discounts LIMIT 10;. Проверьте, что даты не превратились в нули, а русский текст читается без искажений.
Если вместо букв стоят знаки вопроса, строки уже попали в таблицу, и повторный импорт упрется в дубли по первичному ключу.
Если таблица была пустой до импорта, очистите ее командой TRUNCATE TABLE discounts; и повторите запрос с правильным CHARACTER SET. Если в таблице есть другие записи, добавьте REPLACE перед INTO TABLE: строки с совпавшим id заменятся.
Перед большой загрузкой импортируйте в пустую копию таблицы первые десять строк файла – ошибки кодировки и дат всплывут за секунды.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- 7 бесплатных СУБД для управления базами данных 5 мин чтения
- Команды MySQL в консоли: от входа до бэкапа 15 мин чтения
- Модели баз данных: иерархическая, сетевая и реляционная 9 мин чтения
- Работа с датой и временем в MySQL 5 мин чтения
Комментарии
А как загрузить файлы расположенные на компе?
благодарю, статья помогла:)