INTO OUTFILE (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
k (Jeroen Strompf heeft pagina Into outfile (MySQL) hernoemd naar INTO OUTFILE (MySQL))
Regel 17: Regel 17:
 
  FIELDS ESCAPED BY '\'
 
  FIELDS ESCAPED BY '\'
 
  LINES TERMINATED BY '\n';
 
  LINES TERMINATED BY '\n';
 
== Voorbeelden: Sprocs + DDL ==
 
 
<pre>
 
CREATE DEFINER=`root`@`localhost` PROCEDURE `export_save`(
 
in tabelnaam varchar(100),
 
bestandsnaam varchar(100)
 
)
 
BEGIN
 
 
set @ddl=concat
 
(
 
"select * from ",tabelnaam," order by internal_sort_order asc ",
 
"into outfile '/var/mysql-export/", bestandsnaam, "-",
 
DATE_FORMAT( NOW(),'%Y%m%d-%H%i%S'),".tsv'",
 
" fields terminated by '\\t' enclosed by '",char(34),
 
"' lines terminated by '\\n'"
 
);
 
 
prepare s1 from @ddl;
 
execute s1;
 
drop prepare s1;
 
</pre>
 
 
<pre>
 
-- --------------------------------------------------------------------------------
 
-- Routine DDL
 
-- Note: comments before and after the routine body will not be stored by the server
 
-- --------------------------------------------------------------------------------
 
DELIMITER $$
 
 
CREATE DEFINER=`root`@`localhost` PROCEDURE `export_save`(
 
in bron varchar(100),
 
in sorteer varchar(100),
 
in bestandsnaam varchar(100)
 
)
 
BEGIN
 
--
 
-- Write records to a file
 
-- =======================
 
--
 
-- Input arguments:
 
--
 
-- * 'bron': Name of a table or view
 
-- * 'sorteer': Sort order without the words "order by"
 
-- * 'bestandsnaam': filename.
 
--
 
-- Examples
 
-- ========
 
--
 
-- * call export_save("superquery_tmp","","superquery");
 
-- * call export_save("superquery_tmp","internal_sort_order asc","superquery");
 
 
set @ddl=concat
 
(
 
"select * from ",bron,
 
if
 
(
 
sorteer = "",
 
" ",
 
concat(" order by ",sorteer," ")
 
),
 
"into outfile '/var/mysql-export/", bestandsnaam, "-",
 
DATE_FORMAT( NOW(),'%Y%m%d-%H%i%S'),".tsv'",
 
" fields terminated by '\\t' enclosed by '",char(34),
 
"' lines terminated by '\\n'"
 
);
 
 
select @ddl;
 
 
prepare s1 from @ddl;
 
execute s1;
 
drop prepare s1;
 
 
END
 
 
</pre>
 
</pre>
  

Versie van 17 apr 2019 13:43

De gebruikelijke manier om vanuit MySQL records naar een bestand te schrijven, gaat met into outfile.

Voorbeelden

select * from tabel_export into outfile '/tmp/tabel_export.tsv';
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
SELECT field1, field2
FROM table1
INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
FIELDS ESCAPED BY '\'
LINES TERMINATED BY '\n';

Bestanden kunnen niet overschreven worden

Je kunt een bestaand bestand niet overschrijven. Oplossing: DDL gebruiken en een timestamp aan de bestandsnaam toevoegen.

/var ipv. /tmp

Schrijven naar /tmp geeft voortdurend vage klachten. Daarom schrijf ik naar /var. Naar

/var/mysql-export

om precies te zijn. Permissies op die map zijn __7, zodat het MySQL-proces kan schrijven.

Tekencodering

Zie INTO OUTFILE & tekencodering (MySQL).

Zie ook

Bronnen