Що це за інструмент?
Заповнення тестової бази даних, завантаження експорту з таблиці в БД чи перенесення невеликого набору даних часто починається однаково: у вас є CSV-файл, і вам потрібен SQL. Цей інструмент розбирає ваш CSV (використовуючи рядок заголовків як назви стовпців) і будує один вираз INSERT INTO, що охоплює всі рядки даних, готовий для вставки в клієнт бази даних.
Текстові значення обгортаються в одинарні лапки з екрануванням внутрішніх лапок подвоєнням (тож O'Brien стає O''Brien), що є стандартним правилом екранування, спільним для MySQL, PostgreSQL і SQLite. Порожня клітинка CSV записується як ключове слово SQL NULL, а не як порожній рядок — це навмисний вибір, оскільки порожня клітинка в таблиці зазвичай означає "немає значення", а не "порожній текстовий фрагмент", і саме NULL очікують більшість схем для цього.
Чи буде значення взяте в лапки, чи залишене без них, вирішується простою евристикою, а не справжнім визначенням типу: якщо обрізана клітинка виглядає як просте ціле чи десяткове число (за бажанням із провідним знаком мінус), воно записується без лапок; усе інше — включно з тим, що лише нагадує числа з додатковими символами, як-от номери телефонів чи поштові індекси з провідними нулями — береться в лапки як текст. Це робить результат чесним: це хороша відправна точка для невеликого імпорту, а не заміна перевірки ваших даних на відповідність реальній схемі таблиці перед виконанням.
Джерело: розбір CSV відповідає RFC 4180, найближчому до формального стандарту CSV; подвоєння одинарних лапок для екранування рядків є спільною угодою, задокументованою MySQL, PostgreSQL і SQLite.
Навіщо його використовувати?
- Кастомна назва таблиці — задайте цільову таблицю один раз, і кожен рядок націлюється на цю таблицю.
- Коректне екранування рядків — одинарні лапки всередині значень подвоюються, щоб SQL не ламався і не обрізався.
- Передбачувана обробка NULL — порожні клітинки стають NULL замість порожнього рядка, відповідно до того, як більшість баз даних розрізняють відсутні дані.
- Загальноприйнятий синтаксис SQL — форма INSERT INTO ... VALUES ..., яка тут генерується, працює без змін у MySQL, PostgreSQL і SQLite.
- 100% на боці клієнта — ваші CSV-дані (які можуть включати записи клієнтів чи бізнес-дані) розбираються й перетворюються у вашому браузері і ніколи нікуди не завантажуються.
Як користуватися
- Вставте дані CSV з рядком заголовків, наприклад name,age\nAlice,30\nBob,25.
- Введіть назву цільової таблиці (за замовчуванням my_table).
- Натисніть "Generate SQL".
- Скопіюйте вираз INSERT INTO чи завантажте його як файл .sql, а потім виконайте його у своїй базі даних.
Приклад
Введення
name,age,city
Alice,30,
Bob,,NYCРезультат
INSERT INTO `my_table` (`name`, `age`, `city`)
VALUES
('Alice', 30, NULL),
('Bob', NULL, 'NYC');Зверніть увагу, що порожні клітинки стали NULL (не порожніми рядками), а числове значення age 30 залишилося без лапок, тоді як кожне текстове значення взяте в лапки.
Практичні поради
- Заповнення локальної тестової бази даних: експортуйте невеликий зразок як CSV із таблиці, конвертуйте тут і виконайте вираз INSERT у своїй тестовій базі даних.
- Завжди перевіряйте типи стовпців перед виконанням згенерованого SQL для реальної таблиці — цей інструмент визначає числове чи текстове значення простою евристикою, а не за вашою реальною схемою, тож стовпець із цілими числами, що очікує конкретного формату, може потребувати ручного коригування.
- Якщо у вас тисячі рядків, єдиний багаторядковий вираз INSERT, який генерує цей інструмент, все ще є валідним SQL, але дуже великі вирази можуть перевищити максимальний розмір пакета бази даних — спершу розбийте CSV на менші пакети, якщо зіткнетеся з цим обмеженням.
Чому NULL, а не порожній рядок
Поширена помилка при ручному написанні скриптів CSV-в-SQL — трактувати кожну відсутню клітинку як порожній рядок ''. Це технічно валідний SQL, але зазвичай означає не те, що потрібно: стовпець, визначений як ціле число, повністю відхилить '', і навіть у текстовому стовпці '' у більшості схем і звітних запитів мовчки означає щось інше, ніж "ми не знаємо це значення" (перевірка WHERE column IS NULL не збігатиметься з порожніми рядками, і навпаки). Використання NULL для порожніх клітинок відповідає семантиці, яку очікують більшість баз даних і ORM, і уникає помилок типів, коли числовий стовпець має відсутні значення в деяких рядках.
Часті запитання
Чи працює це з будь-якою базою даних SQL?
Згенерований синтаксис — ідентифікатори в зворотних лапках, текстові значення в одинарних лапках, стандартний INSERT INTO ... VALUES ... — є спільним для MySQL, PostgreSQL і SQLite. PostgreSQL суворо не вимагає зворотних лапок навколо ідентифікаторів (він використовує подвійні лапки, якщо взагалі потрібне взяття в лапки), але назви в зворотних лапках теж нешкідливі там, поки у вас немає незвичних назв стовпців, що конфліктують із зарезервованими словами. Тут не дотримується жоден єдиний офіційний стандарт SQL — лише синтаксис, що працює без змін у найпоширеніших базах даних.
Чому порожня клітинка стає NULL, а не порожнім рядком ''?
Це навмисне архітектурне рішення: у більшості реальних експортів CSV порожня клітинка означає, що значення невідоме чи незастосовне, а не буквально порожній текстовий фрагмент. NULL — це те, що очікують більшість схем баз даних для цього. Якщо ваш випадок справді потребує порожніх рядків замість цього, вам доведеться вручну відредагувати згенерований SQL для таких випадків.
Як інструмент вирішує, чи потрібні лапки для значення?
Це проста евристика, а не справжнє визначення типу: якщо обрізана клітинка складається лише з цифр (з необов'язковим провідним мінусом і щонайбільше однією десятковою крапкою), вона записується без лапок як число. Усе інше береться в лапки як текст. Це означає, що поштовий індекс на кшталт 00501 чи номер телефону будуть трактовані як текст (оскільки не проходять сувору цілочислову перевірку лише за наявності додаткових символів — сам по собі провідний нуль тут усе ще розпізнається як числовий, тож перевіряйте такі ідентифікатори, як поштові індекси та ID, перед виконанням SQL).
Чи завантажуються мої дані кудись?
Ні. Розбір і генерація SQL відбуваються в JavaScript у вашому браузері — нічого не надсилається на сервер, що робить безпечним використання з експортованими записами клієнтів чи бізнес-даними.
Чи може він обробляти значення CSV, що містять коми чи лапки?
Так. CSV розбирається за допомогою належного парсера полів у лапках, який розуміє коми, розриви рядків і подвоєні лапки всередині полів у лапках — а не наївний поділ за комами — тому поле на кшталт "Smith, John" читається як одне значення, а не розбивається на два стовпці.