У меня есть командный файл, созданный для базы данных Oracle, которую я сейчас пытаюсь импортировать в базу данных MySQL. Мне приходилось иметь дело со всевозможными несоответствиями между ними. В файле все даты указаны как «17 ноября 1981 года», а не «1981-11-17», как ожидает MySQL.
В пакетном файле была команда ALTER SESSION установить nls_date_format = 'ДД-МЕСЯЦ-ГГГГ'; для установки формата даты. Есть ли эквивалент в MySQL, чтобы заставить его принимать даты как есть, без необходимости значительного редактирования файла?






Я не верю, что это возможно без изменения SQL.
STR_TO_DATE можно использовать в операторах вставки для преобразования строк, или вы можете попробовать передать файл через sed и использовать регулярное выражение для определения дат и их переработки, например что-то вроде этого заменит даты в исходном дампе с одинарными кавычками на вызовы str_to_date и направит полученный преобразованный sql в mysql ...
cat oracledump.sql | sed "s/'[0-9][0-9]-\(JAN\|FEB\|MAR\|APR\|MAY\|JUN\|JUL\|AUG\|SEP\|OCT\|NOV\|DEC\)-[1-2][0-9][0-9][0-9]'/str_to_date(&, '%d-%b-%Y')/g" | mysql newdb
Возможно, вам нужно настроить регулярное выражение для ваших данных, но я тестировал его на образце файла перед публикацией. Зачем писать фрагмент вашего SQL?
Обратите внимание, что он искал даты в двойных кавычках, для одинарных кавычек вы можете использовать sed 's / "[0-9] [0-9] - (ЯНВАРЬ \ | ФЕВ \ | МАР \ | АПРЕЛЬ \ | МАЙ \ | ИЮН \ | ИЮЛЬ \ | АВГУСТ \ | СЕНТ \ | ОКТ \ | НОЯ \ | ДЕКАБРЬ 41; - [1-2] [0-9] [0-9] [ 0-9] "/ str_to_date (& , "% d-% b-% Y") / '
Нет, это были даты с одинарной кавычкой. Пример полной строки выглядит следующим образом: INSERT INTO ord (TOTAL, SHIPDATE, ORDID, ORDERDATE, CUSTID, COMMPLAN) VALUES ('710', '06 -FEB-2002 ',' 615 ', '01 -FEB-2002', '107', '');
Я забыл добавить глобальный модификатор (буква «g» после шаблона). sed "s / '[0-9] [0-9] - (ЯНВ \ | ФЕВ \ | МАР \ | АПР \ | МАЙ \ | ИЮН \ | ИЮЛЬ \ | АВГ \ | СЕНТ \ | ОКТ \ | НОЯБ \ | DEC 41; - [1-2] [0-9] [0-9] [ 0-9] '/ str_to_date (&,'% d-% b-% Y ') / g "сработало для меня на ваших тестовых данных (обратите внимание, что я использую оболочку bash)
Ура! Это отлично сработало. Мне пришлось изменить его снова после того, как я понял, что даты от 1 до 9 были напечатаны только с одной цифрой, но теперь все загружено правильно. Спасибо.
Я изменил конец на> output.sql, но все, что у меня было, это точно такой же файл. Даты не изменились.