INTO OUTFILE (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 64: Regel 64:
 
* http://dev.mysql.com/doc/refman/5.7/en/select-into.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
 
* 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

Versie van 7 jun 2019 17:14

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.

Zie ook

Bronnen