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

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