Ну, я хотел бы добавить свои 2 цента здесь.
Я использую общий веб-хостинг, и я много раз занимался этой проблемой, пытался решить ее самостоятельно, но безрезультатно. Наконец, мне удалось решить эту проблему, проверив различные веб-источники и связавшись с моим провайдером хостинга. Мои вопросы: «Как я могу изменить значение php memory_limit
в совместном веб-хостинге?», «Как мне изменить значение php upload_max_filesize
в совместном веб-хостинге?», «Как мне изменить значение php max_input_vars
в общем веб-хостинге?» , «Как изменить значение php max_execution_time
в совместном веб-хостинге?», «Как изменить значение php max_input_time
в совместном веб-хостинге?» и многое другое, настраивая или изменяя файл php.ini или .htaccess
. Я попытался их изменить, но возникли проблемы. Наконец, я связался с моим хостинг-провайдером, и выяснилось, что я установил свой php в native, они изменили его на php 5.6, вот их ответ:
«Ваш PHP был настроен на« native » режим, который означает, что вы не можете переопределить эти значения. Я изменил вас на «5.6», поэтому вам должно быть хорошо идти ».
blockquote>После этого я подключил свой сайт через ftp Filezilla , также не забудьте сделать так, чтобы ваша служба ftp отображала скрытые файлы и ваш локальный компьютер, потому что файл
.htaccess
был скрыт в моем локальном ноутбуке и на моем веб-сайте. Он был доступен в папке public_html, я только что загрузил его и добавил следующие коды в конец файла, а затем загрузил его обратно на сервер:php_value memory_limit 256M php_value post_max_size 256M php_value upload_max_filesize 64M php_value max_input_vars 1800 php_value max_execution_time 300 php_value max_input_time 300
На данный момент все работает правильно, если кто-то из вас справится с некоторыми проблемами, напишите здесь и предоставьте мне, чтобы я мог изменить приведенные выше коды. Кстати, я также загружаю несколько фотографий, которые показывают изменение.
Еще одна вещь, о которой я почти забыл упомянуть об установке ZipArchive в вашем общем сервисе веб-хостинга, мне удалось установить это требование, просто перейдя на php-настройки через мою cpanel, нажмите на расширения селектора php, а затем отметьте zip-раздел, это все.
Спасибо.
PS: Я открыт для хорошей практики, и если вы видите какую-либо плохую практику, пожалуйста, дайте мне знать, я постараюсь изменить их. Спасибо.
Вам придется жестко закодировать эти заголовки самостоятельно. Что-то вроде:
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
FROM YourTable
INTO OUTFILE '/path/outfile'
Поскольку функциональность «include-headers» пока еще не встроена, и большинство «решений» здесь нужно вводить имена столбцов вручную и / или даже не принимать во внимание, d рекомендовать, чтобы обойти проблему.
Это заставляет меня хотеть выделить это 80% времени, когда я хочу использовать SELECT FROM INFILE или SELECT INTO OUTFILE, я в конечном итоге использую что-то еще из-за некоторых ограничений (здесь, отсутствия «вариантов заголовков», AWS-RDS, отсутствующих прав и т. Д.).
Следовательно , Я точно не отвечаю на вопрос op [...], но он должен ответить на его потребности :) EDIT: и на самом деле ответить на его вопрос: no As от 2017-09-07, вы просто не можете включать заголовки, если вы придерживаетесь команды SELECT INTO OUTFILE : |
Это позволит вам иметь упорядоченные столбцы и / или предел
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
FROM YourTable order by ColName1 limit 3) a
INTO OUTFILE '/path/outfile';
Для сложного выбора с ORDER BY я использую следующее:
SELECT * FROM (
SELECT 'Column name #1', 'Column name #2', 'Column name ##'
UNION ALL
(
// complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
)
) resulting_set
INTO OUTFILE '/path/to/file';
Решение, предоставленное Джо Стеанелли, работает, но составление списка столбцов неудобно, когда задействованы десятки или сотни столбцов. Вот как получить столбец таблицы my_table в my_schema.
-- override GROUP_CONCAT limit of 1024 characters to avoid a truncated result
set session group_concat_max_len = 1000000;
select GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'"))
from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'my_table'
AND TABLE_SCHEMA = 'my_schema'
order BY ORDINAL_POSITION
Теперь вы можете копировать & amp; вставьте полученную строку в качестве первого оператора в методе Джо.
Это альтернативный чит, если вы знакомы с Python или R, и ваша таблица может вписаться в память.
Импортировать таблицу SQL в Python или R, а затем экспортировать из нее в виде CSV, и вы получите имена столбцов, а также данные.
Вот как я это делаю, используя R, требуется библиотека RMySQL:
db <- dbConnect(MySQL(), user='user', password='password', dbname='myschema', host='localhost')
query <- dbSendQuery(db, "select * from mytable")
dataset <- fetch(query, n=-1)
write.csv(dataset, 'mytable_backup.csv')
Это немного обман, но я обнаружил, что это было быстрым способом, когда число столбцов было слишком длинным, чтобы использовать метод concat выше. Примечание: R добавит столбец «row.names» в начале CSV, поэтому вам нужно отказаться от него, если вам нужно полагаться на CSV, чтобы воссоздать таблицу.
SELECT 'ColName1', 'ColName2', 'ColName3' UNION ALL SELECT ColName1, ColName2, ColName3 FROM YourTable INTO OUTFILE 'c:\\datasheet.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
Я думаю, что если вы используете UNION, он будет работать:
select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...
Я не знаю, как напрямую указать заголовки с синтаксисом INTO OUTFILE.
Ниже приведен способ получения заголовков заголовков из имен столбцов динамически.
/* Change table_name and database_name */
SET @table_name = 'table_name';
SET @table_schema = 'database_name';
SET @default_group_concat_max_len = (SELECT @@group_concat_max_len);
/* Sets Group Concat Max Limit larger for tables with a lot of columns */
SET SESSION group_concat_max_len = 1000000;
SET @col_names = (
SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns
FROM information_schema.columns
WHERE table_schema = @table_schema
AND table_name = @table_name);
SET @cols = CONCAT('(SELECT ', @col_names, ')');
SET @query = CONCAT('(SELECT * FROM ', @table_schema, '.', @table_name,
' INTO OUTFILE \'/tmp/your_csv_file.csv\'
FIELDS ENCLOSED BY \'\\\'\' TERMINATED BY \'\t\' ESCAPED BY \'\'
LINES TERMINATED BY \'\n\')');
/* Concatenates column names to query */
SET @sql = CONCAT(@cols, ' UNION ALL ', @query);
/* Resets Group Contact Max Limit back to original value */
SET SESSION group_concat_max_len = @default_group_concat_max_len;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
На самом деле вы можете заставить его работать даже с ORDER BY.
Просто нужно немного обмануть в инструкции order by - мы используем оператор case и заменяем значение заголовка некоторым другим значением, которое гарантировано сортировать сначала в списке (очевидно, это зависит от типа поля и от того, сортируете ли вы ASC или DESC)
Допустим, у вас есть три поля, имя (varchar), is_active (bool), date_something_happens ( дата), и вы хотите отсортировать второй второй по убыванию:
select
'name'
, 'is_active' as is_active
, date_something_happens as 'date_something_happens'
union all
select name, is_active, date_something_happens
from
my_table
order by
(case is_active when 'is_active' then 0 else is_active end) desc
, (case date when 'date' then '9999-12-30' else date end) desc
Итак, , если все столбцы в my_table
являются символьным типом данных , мы можем объединить верхние ответы (Joe, matt и evilguc) вместе, чтобы получить заголовок, добавленный автоматически в один «простой» SQL-запрос, например
select * from (
(select column_name
from information_schema.columns
where table_name = 'my_table'
and table_schema = 'my_schema'
order by ordinal_position)
union all
(select * // potentially complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
from my_table)) as tbl
into outfile '/path/outfile'
fields terminated by ',' optionally enclosed by '"' escaped by '\\'
lines terminated by '\n';
, где последние две строки делают вывод csv.
Обратите внимание, что это может быть медленным, если my_table
очень велико.
Я писал свой код в PHP, и у меня была небольшая проблема с использованием функций concat и union, а также не использовались переменные SQL, так как я получил его для работы, вот мой код:
//first I connected to the information_scheme DB
$headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema");
//took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it)
$headers = '';
$sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE_NAME'";
$result = $headercon->query($sql);
while($row = $result->fetch_row())
{
$headers = $headers . "'" . $row[0] . "', ";
}
$headers = substr("$headers", 0, -2);
// connect to the DB of interest
$con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME");
// export the results to csv
$sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE '/output.csv' FIELDS TERMINATED BY ','";
$result4 = $con->query($sql4);
Я просто делаю 2 запроса, сначала получаю вывод запроса (ограничение 1) с именами столбцов (без жесткого кода, без проблем с именами Joins, Order by, пользовательскими именами столбцов и т. д.), а во-вторых, для создания самого запроса и объединения файлов в один файл CSV:
CSVHEAD=`/usr/bin/mysql $CONNECTION_STRING -e "$QUERY limit 1;"|head -n1|xargs|sed -e "s/ /'\;'/g"`
echo "\'$CSVHEAD\'" > $TMP/head.txt
/usr/bin/mysql $CONNECTION_STRING -e "$QUERY into outfile '${TMP}/data.txt' fields terminated by ';' optionally enclosed by '\"' escaped by '' lines terminated by '\r\n';"
cat $TMP/head.txt $TMP/data.txt > $TMP/data.csv
Вы можете использовать подготовленный оператор с ответом lucek и динамически экспортировать таблицу с именем столбцов в CSV:
--If your table has too many columns
SET GLOBAL group_concat_max_len = 100000000;
--Prepared statement
SET @SQL = ( select CONCAT('SELECT * INTO OUTFILE \'YOUR_PATH\' FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' ESCAPED BY \'\' LINES TERMINATED BY \'\\n\' FROM (SELECT ', GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'")),' UNION select * from YOUR_TABLE) as tmp') from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE' AND TABLE_SCHEMA = 'YOUR_SCHEMA' order BY ORDINAL_POSITION );
--Execute it
PREPARE stmt FROM @SQL;
EXECUTE stmt;
Thank lucek.