#Что происходит и когда инструкция применима
При импорте CSV в SQLite числа, даты и идентификаторы могут оказаться текстом либо потерять ведущие нули: SQLite использует типовую совместимость столбцов, а утилита импорта читает строки как текст. Исправлять нужно проверкой и явным преобразованием на тестовой базе.
Характерный признак: После .import CSV значения сумм сортируются как строки («100» раньше «20»), ZIP-коды лишаются нулей после неверного преобразования, а даты не распознаются приложением.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Автоматически созданная таблицаВ отсутствие схемы импортёр создаёт таблицу с текстовыми столбцами | PRAGMA table_info показывает TEXT | Создать типизированную схему заранее |
| Пустые поля и локальные числаПустая строка, запятая как десятичный разделитель или пробелы мешают преобразованию | typeof() даёт text для суммы | Явно нормализовать поля |
| Идентификатор ошибочно трактуется как числоАртикулы и индексы содержат значащие ведущие нули | После импорта 0012 превращается в 12 | Оставить TEXT и проверить CSV |
#Пошаговая диагностика и исправление
- 1. Сохраните оригинал CSV и проверьте кодировкуВ редакторе, умеющем показывать кодировку, откройте только копию файла. Запишите разделитель (запятая или точка с запятой), наличие первой строки заголовков и десятичный знак. Не открывайте CSV в табличном редакторе с автоматической заменой нулей без предварительной копии.
- 2. Откройте тестовую базу, а не производственнуюСоздайте отдельный каталог для опыта; путь test-import.db не должен совпадать с боевой базой. В терминале с установленным sqlite3 выведите версию SQLite для понимания доступных возможностей.Linux · Терминал (Bash)КомандаЛюбой терминал Linux/macOS/Windows, где установлен sqlite3; вывод — номер установленной версии.
sqlite3 --version
- 3. Изучите типы исходной таблицыЕсли импорт уже выполнен, на резервной копии проверьте определение таблицы. Пустой результат означает, что таблицы с таким именем нет — сначала выясните путь базы.
- Только чтение, import_items — пример имени таблицы, замените его фактическимLinux · Терминал (Bash)КомандаТолько чтение, import_items — пример имени таблицы, замените его фактическим.
sqlite3 -readonly /srv/app/data/app.db 'PRAGMA table_info(import_items);'
- 4. Выделите три колонки с разными правиламиДля суммы выбирайте числовой тип (обычно INTEGER в копейках для денег или REAL для приблизительных величин), дату храните как согласованный ISO-текст либо числовую метку, а код товара/индекс — TEXT. Не выбирайте тип по внешнему виду одного значения.
- 5. Сделайте контрольный импорт в промежуточную таблицуСоздайте на отдельной тестовой базе таблицу с текстовыми столбцами. В консоли sqlite3 подайте .mode csv и .import: при наличии заголовка обработайте его с помощью поддерживаемого параметра --skip 1 только после проверки справки .help import вашей версии; иначе предварительно удалите заголовок в копии CSV.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
- 6. Проверьте фактические типы после импортаВнутри sqlite3 после импорта выполните SELECT с typeof. Результат text для price_text ожидаем в промежуточной таблице; это ещё не ошибка, пока значения не проверены и не преобразованы.Linux · Терминал (Bash)КомандаЗапрос на чтение, после импорта в staging. Ожидаются текстовые данные.
sqlite3 -readonly /tmp/test-import.db "SELECT sku, price_text, typeof(price_text) FROM staging LIMIT 10;"
- 7. Настройте строгие проверки до вставки в конечную схемуПеред заполнением целевой таблицы убедитесь, что сумма не содержит неожиданных пробелов или запятой вместо точки, что даты валидны по правилам приложения, и что уникальные коды сохранили нули. Неподходящие строки отправьте в протокол ошибок, а не преобразуйте вслепую.
- 8. Сравните количество и выборку строкПодсчитайте строки до и после переноса на тестовой базе и проверьте 10 случайных значений каждого типа. Для финального импорта используйте транзакцию и параметризованные запросы приложения с явным преобразованием значений; при ошибке выполняйте откат, не меняя исходные данные.
#Как проверить исправление
Суммы корректно участвуют в числовой сортировке, коды с ведущими нулями сохранены, число импортированных и отбракованных строк в сумме соответствует исходному CSV.
#Если исправление не помогло
Если таблица объявлена STRICT, некорректная вставка должна выдавать ошибку типа; она полезна для обнаружения испорченной записи. Для повторного импорта исправьте исходные строки, не отключая проверки.