INTO OUTFILE (MySQL)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

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.

Schrijven naar willekeure locaties

Zie Can't create/write to file (MySQL).

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