INTO OUTFILE (MySQL)
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
gaf ooit vage klachten. Toen schrijf ik naar /var
. Naar
/var/mysql-export
om precies te zijn. Permissies op die map zijn __7, zodat het MySQL-proces kan schrijven.
In recente jaren gebruik ik gewoon weer /tmp.
Escape-codes
Als MySQL schrijft naar een bestand, worden control characters (bv. null of newline) voorzien van een escape-character (typisch "\"). Da's niet altijd handig.
Oplossing: Escape character specificeren [1]. Bv.:
set @ddl = concat ( "select ",@field_names," from ", in_table_name, " ", "order by ", in_sort_order, " ", "into outfile '",@file_and_path, "' ", "character set latin1 ", "fields terminated by '\\t' ", "optionally enclosed by '", char(34), "' ", "escaped by '' ", "lines terminated by '\\n'" );
Dit werkte in april 2019 in één keer, om newlines binnen een tekstveld te behouden.
Ik geloof dat dit de zogenaamde export_options zijn:
- The FIELDS ESCAPED BY character
- The FIELDS [OPTIONALLY] ENCLOSED BY character
- The first character of the FIELDS TERMINATED BY
- LINES TERMINATED BY values
- ASCII NUL (the zero-valued byte; what is actually written following the escape character is ASCII 0, not a zero-valued byte)
Er lijkt echter geen gemakkelijke manier te zijn om \N
in exportbestanden te onderdrukken.
Zie ook
Bronnen
- http://stackoverflow.com/questions/21253704/how-to-save-mysql-query-output-to-excel-or-txt-file
- https://www.michaelrigart.be/en/blog/export-directly-from-mysql-to-csv.html
- http://dev.mysql.com/doc/refman/5.7/en/select-into.html
- http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_character_set_filesystem
- https://stackoverflow.com/questions/9140879/mysql-select-into-outfile-export-options