INTO OUTFILE (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 3: Regel 3:
 
== Voorbeelden ==
 
== Voorbeelden ==
  
Recent werk - April 2020:
+
April-mei 2020:
  
 
<pre>
 
<pre>
 
select
 
select
*
+
  *
 
from
 
from
product_fba_202004
+
  product_fba_202004
 +
order by
 +
  sorder_order,
 +
  campaign_name,
 +
  adgroup_name
 
into outfile
 
into outfile
'/tmp/product_fba_202004.tsv'
+
  '/tmp/product_fba_202004.tsv'
 
character set
 
character set
utf8
+
  utf8
 
fields terminated by  
 
fields terminated by  
'\t'
+
  '\t'
 
optionally enclosed by
 
optionally enclosed by
'"'
+
  '"'
 
lines terminated by
 
lines terminated by
'\n';
+
  '\n';
 
</pre>
 
</pre>
  

Versie van 13 mei 2020 18:47

De gebruikelijke manier om vanuit MySQL records naar een bestand te schrijven, gaat met into outfile.

Voorbeelden

April-mei 2020:

select
   *
from
   product_fba_202004
order by
   sorder_order,
   campaign_name,
   adgroup_name
into outfile
   '/tmp/product_fba_202004.tsv'
character set
   utf8
fields terminated by 
   '\t'
optionally enclosed by
   '"'
lines terminated by
   '\n';

Oudere 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