SQLite SQLiteLinuxWindowsPHPPython

SQLite: При импорте CSV в SQLite нарушается типизация столбцов

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

При импорте CSV в SQLite числа, даты и идентификаторы могут оказаться текстом либо потерять ведущие нули: SQLite использует типовую совместимость столбцов, а утилита импорта читает строки как текст. Исправлять нужно проверкой и явным преобразованием на тестовой базе.

В этой статье
  1. Что происходит и когда инструкция применима
  2. Как отличить возможные причины
  3. Пошаговая диагностика и исправление
  4. Как проверить исправление
  5. Если исправление не помогло

#Что происходит и когда инструкция применима

При импорте CSV в SQLite числа, даты и идентификаторы могут оказаться текстом либо потерять ведущие нули: SQLite использует типовую совместимость столбцов, а утилита импорта читает строки как текст. Исправлять нужно проверкой и явным преобразованием на тестовой базе.

Характерный признак: После .import CSV значения сумм сортируются как строки («100» раньше «20»), ZIP-коды лишаются нулей после неверного преобразования, а даты не распознаются приложением.

#Как отличить возможные причины

Возможная причинаКак узнатьЧто делать
Автоматически созданная таблицаВ отсутствие схемы импортёр создаёт таблицу с текстовыми столбцамиPRAGMA table_info показывает TEXTСоздать типизированную схему заранее
Пустые поля и локальные числаПустая строка, запятая как десятичный разделитель или пробелы мешают преобразованиюtypeof() даёт text для суммыЯвно нормализовать поля
Идентификатор ошибочно трактуется как числоАртикулы и индексы содержат значащие ведущие нулиПосле импорта 0012 превращается в 12Оставить TEXT и проверить CSV

#Пошаговая диагностика и исправление

  1. 1. Сохраните оригинал CSV и проверьте кодировкуВ редакторе, умеющем показывать кодировку, откройте только копию файла. Запишите разделитель (запятая или точка с запятой), наличие первой строки заголовков и десятичный знак. Не открывайте CSV в табличном редакторе с автоматической заменой нулей без предварительной копии.
  1. 2. Откройте тестовую базу, а не производственнуюСоздайте отдельный каталог для опыта; путь test-import.db не должен совпадать с боевой базой. В терминале с установленным sqlite3 выведите версию SQLite для понимания доступных возможностей.
    Linux · Терминал (Bash)Команда
    Любой терминал Linux/macOS/Windows, где установлен sqlite3; вывод — номер установленной версии.
    sqlite3 --version
  1. 3. Изучите типы исходной таблицыЕсли импорт уже выполнен, на резервной копии проверьте определение таблицы. Пустой результат означает, что таблицы с таким именем нет — сначала выясните путь базы.
  2. Только чтение, import_items — пример имени таблицы, замените его фактическим
    Linux · Терминал (Bash)Команда
    Только чтение, import_items — пример имени таблицы, замените его фактическим.
    sqlite3 -readonly /srv/app/data/app.db 'PRAGMA table_info(import_items);'
  1. 4. Выделите три колонки с разными правиламиДля суммы выбирайте числовой тип (обычно INTEGER в копейках для денег или REAL для приблизительных величин), дату храните как согласованный ISO-текст либо числовую метку, а код товара/индекс — TEXT. Не выбирайте тип по внешнему виду одного значения.
  1. 5. Сделайте контрольный импорт в промежуточную таблицуСоздайте на отдельной тестовой базе таблицу с текстовыми столбцами. В консоли sqlite3 подайте .mode csv и .import: при наличии заголовка обработайте его с помощью поддерживаемого параметра --skip 1 только после проверки справки .help import вашей версии; иначе предварительно удалите заголовок в копии CSV.
  2. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Создаёт таблицу только в /tmp/test-import.db; перед запуском убедитесь, что такого файла с важными данными …
    Linux · Терминал (Bash)С осторожностью
    Создаёт таблицу только в /tmp/test-import.db; перед запуском убедитесь, что такого файла с важными данными нет.
    sqlite3 /tmp/test-import.db 'CREATE TABLE staging(sku TEXT, price_text TEXT, created_at TEXT);'

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

    Вариант 2Только для тестовой базы и CSV с заголовком, содержащего 3 поля: sku, price_text, created_at.
    Linux · Терминал (Bash)С осторожностью
    Только для тестовой базы и CSV с заголовком, содержащего 3 поля: sku, price_text, created_at. Нужен sqlite3 CLI с поддержкой --skip; проверить .help import. Источник /tmp/source.csv — пример, замените на реальный путь.
    sqlite3 /tmp/test-import.db '.import --csv --skip 1 /tmp/source.csv staging'

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. 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;"
  1. 7. Настройте строгие проверки до вставки в конечную схемуПеред заполнением целевой таблицы убедитесь, что сумма не содержит неожиданных пробелов или запятой вместо точки, что даты валидны по правилам приложения, и что уникальные коды сохранили нули. Неподходящие строки отправьте в протокол ошибок, а не преобразуйте вслепую.
  1. 8. Сравните количество и выборку строкПодсчитайте строки до и после переноса на тестовой базе и проверьте 10 случайных значений каждого типа. Для финального импорта используйте транзакцию и параметризованные запросы приложения с явным преобразованием значений; при ошибке выполняйте откат, не меняя исходные данные.

#Как проверить исправление

Суммы корректно участвуют в числовой сортировке, коды с ведущими нулями сохранены, число импортированных и отбракованных строк в сумме соответствует исходному CSV.

#Если исправление не помогло

Если таблица объявлена STRICT, некорректная вставка должна выдавать ошибку типа; она полезна для обнаружения испорченной записи. Для повторного импорта исправьте исходные строки, не отключая проверки.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.