PDA

Показать полную графическую версию : Странное поведение phpmyadmin


inzaim
12-08-2015, 11:53
При снятии дампа с mysql через phpmyadmin получаю на выходе
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
`disk` varchar(255) default NULL,
`hl` varchar(255) default NULL,
`ll` varchar(255) default NULL,
`extensions` varchar(255) default NULL,
`date` datetime default NULL,
`size` double default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir\\', 'files', '.xml', '2015-08-07 11:13:00', 389);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir\\', '07.08.2015', '.xml', '2015-08-07 16:04:00', 561);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'mysqldump', '.exe', '2008-02-13 13:00:00', 2146944);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'files', '.sql', '2015-08-07 11:35:00', 0);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'DirToXML', '.bat', '2015-08-07 15:59:00', 5375);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir\\', 'files', '.xml', '2015-08-07 11:13:00', 389);

Но когда при помощи скрипта
chcp 65001
echo -- > C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo DROP TABLE IF EXISTS `files`; >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo CREATE TABLE IF NOT EXISTS `files` ( >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo `disk` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo `hl` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo `ll` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo `extensions` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo `date` datetime default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo `size` double default NULL >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo ) ENGINE=MyISAM DEFAULT CHARSET=utf8; >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql

for /f "delims=" %%a in ('dir %1 /S /B /A:-D-L') do @(
>nul ping -n 1 -w 1 ""
>>"C:\Users\admin\Documents\filemonsql\dir\%date%.sql" echo INSERT INTO `files` VALUES ('%%~da', '\%%~pa\', '%%~na', '%%~xa', '%%~ta', %%~za^)^;
)
@pause
Собираю содержимое каталога или диска, то на выходе получаю немного отличающуюся информацию:
DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
`disk` varchar(255) default NULL,
`hl` varchar(255) default NULL,
`ll` varchar(255) default NULL,
`extensions` varchar(255) default NULL,
`date` datetime default NULL,
`size` double default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', '07.08.2015', '.sql', '07.08.2015 16:11', 557);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'DirToXML', '.bat', '11.08.2015 15:59', 5001);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'DirToXML_rezerv', '.bat', '07.08.2015 15:59', 5375);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'impotTOmysql', '.bat', '07.08.2015 16:42', 389);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'mysql', '.bat', '07.08.2015 16:53', 56);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'mysqldump', '.exe', '13.02.2008 13:00', 2146944);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'spy off', '.bat', '10.08.2015 16:37', 3955);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\dir\\', '10.08.2015', '.xml', '11.08.2015 10:19', 37955313);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\dir\\', '11.08.2015', '.sql', '11.08.2015 16:00', 1370);

При попытке засунуть инструментами phpmyadmin дамп в базу, то в строке с адресом расположения файла пропадают двойные слешы, а одинарный просто пропадает и в бд я имею на выходе следующую строку
\UsersadminDocumentsfilemonsqldir\

Что за ерись и как её побороть?

greg zakharov
12-08-2015, 18:04
Дык может дело не в пыхадмине, а в командном файле? И потом, для чего нужен пыхадмин, когда есть кошерный MySQL Workbanch (речь ведь о мускуле, верно?)?

inzaim
17-08-2015, 10:18
Попробовал изменить подход и все сделать через cmd, но не тут то было.
Поясню логику свою логику. Если не идет через РНРмайадмин, то возможно ошибка где-то в самом майадмине. Решил напрямую обращаться через mysql.exe.

Сформировал информацию для БД скриптом:

: устанавливаем кодировку UTF-8.
: Кодировка необходима для корректного открывания и импорта полученного *.XML в программу Excel
chcp 65001
: Тут формируется правильный заголовок для *.bat файла.
: Обратите внимание на символ ^. Этот символ позволяет нам выводить в echo специальные символы.
: Символ ^ делает "экранирование" специальных символов, и они печатаются к нормальный текст.
echo -- > C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
: Структура таблицы `files`
echo DROP TABLE IF EXISTS `files`; >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo CREATE TABLE IF NOT EXISTS `files` ( >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo `disk` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo `hl` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo `ll` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo `extensions` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo `date` datetime default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo `size` double default NULL >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo ) ENGINE=MyISAM DEFAULT CHARSET=utf8; >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
: В этой части начинается магия.
: Для понимания того, что тут написано используйте help для команды for
: В скобках мы кладем команду dir, которая запускается с s-рекурсией по всем подпапкам, b-вывод полных путей до файлов с именами файлов, x-позволяет нам без ошибок, если мена файлов очень длинные, продолжить выполнение скрипта. Х-сократит слишком длинные имена, без потери связи.
: после do выполняем echo, которое выводит нам необходимую информацию из DIR, разбивая её по ключам из команды FOR, записывая вывод в файл.
: Двойная >> необходимо, чтобы дозаписывалась\писалась каждая прошенная строка
for /f "delims=" %%a in ('dir %1 /S /B /A:-D-L') do @(
>nul ping -n 1 -w 1 ""
>>"C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat" echo INSERT INTO `files` VALUES ('%%~da', '%%~pa', '%%~na', '%%~xa', '%%~ta', %%~za^)^;
)
: Вызываем импорт sql в базу данных через mysql.exe
%~dp0mysql.bat


На выходе получаю:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
`disk` varchar(255) default NULL,
`hl` varchar(255) default NULL,
`ll` varchar(255) default NULL,
`extensions` varchar(255) default NULL,
`date` datetime default NULL,
`size` double default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', '14.08.2015', '.bat', '14.08.2015 15:55', 996);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'DirToSQL', '.bat', '17.08.2015 09:45', 3298);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'DirToXML_rezerv', '.bat', '07.08.2015 15:59', 5375);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'mysql', '.bat', '17.08.2015 09:43', 123);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir_output\\', '14.08.2015', '.bat', '14.08.2015 16:00', 991);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir_output\\', '17.08.2015', '.bat', '17.08.2015 09:45', 991);


Полученные данные запускаются в БД вот этим скриптом:

chcp 65001
C:\AppServ\MySQL\bin\mysql.exe -uroot -pPASSWORD --default-character-set=utf8 samba < %~dp0dir_output\%date%.bat


На выходе получаю ошибку:

ERROR at line 12: Unknown command '\U'.


Но как только одинарные \ меняются на двойные \\, то все чудесным образом начинает работать. Как добавить их через скрипт, подскажите. Парсить БД на выходе и менять символ \ на \\ не предлагать )))
Дело в одинарном слеше.




© OSzone.net 2001-2012