@immelnikoff
Изучаю БД

Экспорт данных из QUIK по ODBC. Как налету преобразовывать VARCHAR-поля в правильные (DATE, DECIMAL, ENUM)?

Экспортирую данные из QUIK 8 по ODBC. Проблема в том, что QUIK экспортирует поля как строки (кроме чисел, с ними всё ок), а мне нужно их складывать в компактную табличку с правильными компактными полями. Как это можно сделать наиболее правильным способом?
Пока есть идея лить данные в первичную таблицу с VARCHAR-полями, а на ней поставить триггер на каждый INSERT. При каждом INSERT-е в первичную таблицу триггер будет вызывать процедурку, которая будет преобразовывать поля в нужные и INSERT-ить уже в целевую компактную табличку.
Насколько такой подход грамотный?
  • Вопрос задан
  • 548 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Подход абсолютно неграмотный. MySQL при вставке в таблицу (как и при большинстве операций) автоматически приводит данные к нужному типу.
А поля DATA и ENUM вообще всегда передаются как строки, только DATA должно быть в правильном формате, 'YYYY-MM-DD'.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
В тексте запроса ЛЮБЫЕ данные представлены как их строковые представления. Да что там - сам SQL-запрос есть строковый литерал.

Поэтому следует озаботиться исключительно правильным представлением. Форматом. Если данные - число, то десятичным разделителем должна быть точка. Если это дата или строка - должны присутствовать обрамляющие кавычки, причём дата должна быть в формате, понятном текущей СУБД (предпочтительно YYYY-MM-DD - этот формат понимают все СУБД), а в строке должны быть экранированы все символы, являющиеся служебными. И т.п.

Если выгруженные данные не соответствуют этому формату, то в запросе на добавление можно использовать не напрямую значение (и потом маяться дурью в процедуре/триггере), а, используя встроенные функции, преобразовать данные к правильному типу. Например, если в поле надо вставить число, а в выгрузке использована запятая в качестве разделителя, это будет
INSERT ... VALUES ( ... , CAST(REPLACE(@value, ',', '.') AS DOUBLE), ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы