INTO OUTFILE (MySQL)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

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';

</pre>

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

Bij wegschrijven naar een bestand, heeft MySQL de gewoonte, om control characters (bv. null of newline) te 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.

Zie ook

Bronnen