Можно взять уже существующий запрос, но все равно придется менять формат вывода данных (не думаю, что вам нужна для импорта html-верстка). Можно сделать и внутри имеющегося скрипта, главное, потом не запутаться в коде (т.к. он разрастется из-за дополнительных настроек и условий).
Ссылка должна вести на обычный php-скрипт. Код этого файла я привел выше.
Результат вашего sql-запроса нужно поместить в переменную $rec (если смотреть на код выше).
В результате, при переходе по ссылке на этот php-скрипт пользователю будет предложено сохранить файл с названием $filename.csv (имя можно сформировать самому, см. заголовки), в качестве содержимого будут данные из $rec. Все достаточно просто, с остальным можно поэкспериментировать:)
Если так же утрированно - то формировать заголовки и содержимое, аналогичное обычному скачиванию файла. Вот, например, для csv (выдернул из контекста):
$filename = "export".date("dmY");header("Content-Disposition: attachment; filename=\"$filename.csv\"");header("Content-Type: application/x-force-download; name=\"$filename.csv\"");header('Expires: 0');if (USR_BROWSER_AGENT == 'IE') {header('Cache-Control: must-revalidate, post-check=0, pre-check=0');header('Pragma: public');} else {header('Pragma: no-cache');}echo $rec;exit();
в переменную $rec можно запихнуть что угодно, что собственно и будет составлять контент файла.
PS: не претендую на абсолютную правильность, да и коду уже лет 5, но вроде до сих пор работает:)
дубль сообщения
Без. (линк на mysql.com)
Сопоставление - необязательный параметр, можно ничего не писать, т.е. вот так:
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;
блин, не заметил про перл:)
например, iconv
Максим Концепция, это не влияет на кодировку, в которой хранятся данные. Да и потом, вместо этих команд можно написать SET NAMES 'utf8'; - это в общем-то аналогично. Но меняет параметры подключения, а не кодировку данных.
перекодировать данные из utf в cp1251
Например:
function utf8win1251($s){ $out = $c1 = ""; $byte2=false; for ($c=0;$c<strlen($s);$c++){ $i=ord($s[$c]); if ($i<=127) $out.=$s[$c]; if ($byte2){ $new_c2=($c1&3)*64+($i&63); $new_c1=($c1>>2)&5; $new_i=$new_c1*256+$new_c2; if ($new_i==1025){ $out_i=168; } else{ if ($new_i==1105){ $out_i=184; } else { $out_i=$new_i-848; } } $out.=chr($out_i); $byte2=false; } if (($i>>5)==6) { $c1=$i; $byte2=true; } } return $out; }
Надежнее всего - сделать дамп, в нем автозаменой поменять у таблиц кодировку. Код будет выглядеть примерно так:
CREATE TABLE `XXX` (....) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Нужно поменять cp1251 на нужное значение (utf8, например), и закачать обратно дамп.
Можно и без дампа (начиная с версии 4.1):
ALTER DATABASE db_name [DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]]
но через дамп все же надежнее (а может, просто привычнее :) )
в какой кодировке таблицы в базе? Какая кодировка используется при подключении?
Возможно, база создалась в какой-нибудь кривой кодировке (типа latin1, дефолтная ненастроенная кодировка), а скрипт жестко вытаскивает данные в кириллице (SET NAMES 'cp1251'), в общем, проблема где-то рядом:)
UPD: перечитал исходник - проблема действительно с кешем, я описал решение проблемы с кодировкой... :)