The file name must be given as a literal string. On Windows,
specify backslashes in path names as forward slashes or doubled
backslashes. As of MySQL 5.0.19, the
character_set_filesystem system
variable controls the interpretation of the file name.

The server uses the character set indicated by the
character_set_database system
variable to interpret the information in the file. SET
NAMES and the setting of
character_set_client do not
affect interpretation of input. If the contents of the input file
use a character set that differs from the default, it is usually
preferable to specify the character set of the file by using the
CHARACTER SET clause, which is available as of
MySQL 5.0.38. A character set of binary
specifies “no conversion.”

LOAD DATA
INFILE interprets all fields in the file as having the
same character set, regardless of the data types of the columns
into which field values are loaded. For proper interpretation of
file contents, you must ensure that it was written with the
correct character set. For example, if you write a data file with
mysqldump -T or by issuing a
SELECT ... INTO
OUTFILE statement in mysql, be sure
to use a --default-character-set option so that
output is written in the character set to be used when the file is
loaded with LOAD DATA
INFILE.

Note that it is currently not possible to load data files that use
the ucs2 character set.

If you use LOW_PRIORITY, execution of the
LOAD DATA statement is delayed
until no other clients are reading from the table. This affects
only storage engines that use only table-level locking (such as
MyISAM, MEMORY, and
MERGE).

If you specify CONCURRENT with a
MyISAM table that satisfies the condition for
concurrent inserts (that is, it contains no free blocks in the
middle), other threads can retrieve data from the table while
LOAD DATA is executing. This option
affects the performance of LOAD
DATA a bit, even if no other thread is using the table
at the same time.

If LOCAL is specified, the file is read by
the client program on the client host and sent to the server.
The file can be given as a full path name to specify its exact
location. If given as a relative path name, the name is
interpreted relative to the directory in which the client
program was started.

When using LOCAL with
LOAD DATA, a copy of the file
is created in the server's temporary directory. This is
not the directory determined by the value
of tmpdir or
slave_load_tmpdir, but rather
the operating system's temporary directory, and is not
configurable in the MySQL Server. (Typically the system
temporary directory is /tmp on Linux
systems and C:\WINDOWS\TEMP on Windows.)
Lack of sufficient space for the copy in this directory can
cause the LOAD DATA
LOCAL statement to fail.

If LOCAL is not specified, the file must be
located on the server host and is read directly by the server.
The server uses the following rules to locate the file:

If the file name is an absolute path name, the server uses
it as given.

If the file name is a relative path name with one or more
leading components, the server searches for the file
relative to the server's data directory.

If a file name with no leading components is given, the
server looks for the file in the database directory of the
default database.

In the non-LOCAL case, these rules mean that a
file named as ./myfile.txt is read from the
server's data directory, whereas the file named as
myfile.txt is read from the database
directory of the default database. For example, if
db1 is the default database, the following
LOAD DATA statement reads the file
data.txt from the database directory for
db1, even though the statement explicitly loads
the file into a table in the db2 database:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

For security reasons, when reading text files located on the
server, the files must either reside in the database directory or
be readable by all. Also, to use
LOAD DATA
INFILE on server files, you must have the
FILE privilege. See
Section 6.2.1, “Privileges Provided by MySQL”. For
non-LOCAL load operations, if the
secure_file_priv system variable
is set to a nonempty directory name, the file to be loaded must be
located in that directory.

Using LOCAL is a bit slower than letting the
server access the files directly, because the contents of the file
must be sent over the connection by the client to the server. On
the other hand, you do not need the
FILE privilege to load local files.

With LOAD DATA
LOCAL INFILE, data-interpretation and duplicate-key
errors become warnings and the operation continues because the
server has no way to stop transmission of the file in the
middle of the operation. For duplicate-key errors, this is the
same as if IGNORE is specified.
IGNORE is explained further later in this
section.

The REPLACE and IGNORE
keywords control handling of input rows that duplicate existing
rows on unique key values:

If you specify REPLACE, input rows replace
existing rows. In other words, rows that have the same value
for a primary key or unique index as an existing row. See
Section 13.2.7, “REPLACE Syntax”.

If you specify IGNORE, rows that duplicate
an existing row on a unique key value are discarded.

If you do not specify either option, the behavior depends on
whether the LOCAL keyword is specified.
Without LOCAL, an error occurs when a
duplicate key value is found, and the rest of the text file is
ignored. With LOCAL, the default behavior
is the same as if IGNORE is specified; this
is because the server has no way to stop transmission of the
file in the middle of the operation.

To ignore foreign key constraints during the load operation, issue
a SET foreign_key_checks = 0 statement before
executing LOAD DATA.

If you use LOAD DATA
INFILE on an empty MyISAM table, all
nonunique indexes are created in a separate batch (as for
REPAIR TABLE). Normally, this makes
LOAD DATA
INFILE much faster when you have many indexes. In some
extreme cases, you can create the indexes even faster by turning
them off with ALTER TABLE ... DISABLE KEYS
before loading the file into the table and using ALTER
TABLE ... ENABLE KEYS to re-create the indexes after
loading the file. See Section 8.3.2.1, “Speed of INSERT Statements”.

For both the LOAD DATA
INFILE and
SELECT ... INTO
OUTFILE statements, the syntax of the
FIELDS and LINES clauses is
the same. Both clauses are optional, but FIELDS
must precede LINES if both are specified.

If you specify a FIELDS clause, each of its
subclauses (TERMINATED BY,
[OPTIONALLY] ENCLOSED BY, and ESCAPED
BY) is also optional, except that you must specify at
least one of them.

If you specify no FIELDS or
LINES clause, the defaults are the same as if
you had written this:

(Backslash is the MySQL escape character within strings in SQL
statements, so to specify a literal backslash, you must specify
two backslashes for the value to be interpreted as a single
backslash. The escape sequences '\t' and
'\n' specify tab and newline characters,
respectively.)

In other words, the defaults cause
LOAD DATA
INFILE to act as follows when reading input:

Look for line boundaries at newlines.

Do not skip over any line prefix.

Break lines into fields at tabs.

Do not expect fields to be enclosed within any quoting
characters.

Interpret characters preceded by the escape character
“\” as escape sequences. For
example, “\t”,
“\n”, and
“\\” signify tab, newline, and
backslash, respectively. See the discussion of FIELDS
ESCAPED BY later for the full list of escape
sequences.

Use “\” to escape instances of
tab, newline, or “\” that
occur within field values.

Write newlines at the ends of lines.

Note

If you have generated the text file on a Windows system, you
might have to use LINES TERMINATED BY '\r\n'
to read the file properly, because Windows programs typically
use two characters as a line terminator. Some programs, such as
WordPad, might use \r as a
line terminator when writing files. To read such files, use
LINES TERMINATED BY '\r'.

If all the lines you want to read in have a common prefix that you
want to ignore, you can use LINES STARTING BY
'prefix_string' to skip over
the prefix, and anything before it. If a line
does not include the prefix, the entire line is skipped. Suppose
that you issue the following statement:

The resulting rows will be ("abc",1) and
("def",2). The third row in the file is skipped
because it does not contain the prefix.

The IGNORE number
LINES option can be used to ignore lines at the start of
the file. For example, you can use IGNORE 1
LINES to skip over an initial header line containing
column names:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

When you use SELECT
... INTO OUTFILE in tandem with
LOAD DATA
INFILE to write data from a database into a file and
then read the file back into the database later, the field- and
line-handling options for both statements must match. Otherwise,
LOAD DATA
INFILE will not interpret the contents of the file
properly. Suppose that you use
SELECT ... INTO
OUTFILE to write a file with fields delimited by commas:

The likely result is that each input line would be interpreted as
a single field.

LOAD DATA
INFILE can be used to read files obtained from external
sources. For example, many programs can export data in
comma-separated values (CSV) format, such that lines have fields
separated by commas and enclosed within double quotation marks,
with an initial line of column names. If the lines in such a file
are terminated by carriage return/newline pairs, the statement
shown here illustrates the field- and line-handling options you
would use to load the file:

If the input values are not necessarily enclosed within quotation
marks, use OPTIONALLY before the
ENCLOSED BY keywords.

Any of the field- or line-handling options can specify an empty
string (''). If not empty, the FIELDS
[OPTIONALLY] ENCLOSED BY and FIELDS ESCAPED
BY values must be a single character. The
FIELDS TERMINATED BY, LINES STARTING
BY, and LINES TERMINATED BY values
can be more than one character. For example, to write lines that
are terminated by carriage return/linefeed pairs, or to read a
file containing such lines, specify a LINES TERMINATED BY
'\r\n' clause.

To read a file containing jokes that are separated by lines
consisting of %%, you can do this

FIELDS [OPTIONALLY] ENCLOSED BY controls
quoting of fields. For output
(SELECT ... INTO
OUTFILE), if you omit the word
OPTIONALLY, all fields are enclosed by the
ENCLOSED BY character. An example of such
output (using a comma as the field delimiter) is shown here:

Occurrences of the ENCLOSED BY character within
a field value are escaped by prefixing them with the
ESCAPED BY character. Also note that if you
specify an empty ESCAPED BY value, it is
possible to inadvertently generate output that cannot be read
properly by LOAD DATA
INFILE. For example, the preceding output just shown
would appear as follows if the escape character is empty. Observe
that the second field in the fourth line contains a comma
following the quote, which (erroneously) appears to terminate the
field:

For input, the ENCLOSED BY character, if
present, is stripped from the ends of field values. (This is true
regardless of whether OPTIONALLY is specified;
OPTIONALLY has no effect on input
interpretation.) Occurrences of the ENCLOSED BY
character preceded by the ESCAPED BY character
are interpreted as part of the current field value.

If the field begins with the ENCLOSED BY
character, instances of that character are recognized as
terminating a field value only if followed by the field or line
TERMINATED BY sequence. To avoid ambiguity,
occurrences of the ENCLOSED BY character within
a field value can be doubled and are interpreted as a single
instance of the character. For example, if ENCLOSED BY
'"' is specified, quotation marks are handled as shown
here:

For input, if the FIELDS ESCAPED BY
character is not empty, occurrences of that character are
stripped and the following character is taken literally as
part of a field value. Some two-character sequences that are
exceptions, where the first character is the escape character.
These sequences are shown in the following table (using
“\” for the escape character).
The rules for NULL handling are described
later in this section.

If the FIELDS ESCAPED BY character is
empty, escape-sequence interpretation does not occur.

For output, if the FIELDS ESCAPED BY
character is not empty, it is used to prefix the following
characters on output:

The FIELDS ESCAPED BY character

The FIELDS [OPTIONALLY] ENCLOSED BY
character

The first character of the FIELDS TERMINATED
BY and LINES TERMINATED BY
values

ASCII 0 (what is actually written
following the escape character is ASCII
“0”, not a zero-valued
byte)

If the FIELDS ESCAPED BY character is
empty, no characters are escaped and NULL
is output as NULL, not
\N. It is probably not a good idea to
specify an empty escape character, particularly if field
values in your data contain any of the characters in the list
just given.

In certain cases, field- and line-handling options interact:

If LINES TERMINATED BY is an empty string
and FIELDS TERMINATED BY is nonempty, lines
are also terminated with FIELDS TERMINATED
BY.

If the FIELDS TERMINATED BY and
FIELDS ENCLOSED BY values are both empty
(''), a fixed-row (nondelimited) format is
used. With fixed-row format, no delimiters are used between
fields (but you can still have a line terminator). Instead,
column values are read and written using a field width wide
enough to hold all values in the field. For
TINYINT,
SMALLINT,
MEDIUMINT,
INT, and
BIGINT, the field widths are 4,
6, 8, 11, and 20, respectively, no matter what the declared
display width is.

LINES TERMINATED BY is still used to
separate lines. If a line does not contain all fields, the
rest of the columns are set to their default values. If you do
not have a line terminator, you should set this to
''. In this case, the text file must
contain all fields for each row.

Fixed-row format also affects handling of
NULL values, as described later.

Note

Fixed-size format does not work if you are using a multibyte
character set.

Note

Before MySQL 5.0.6, fixed-row format used the display width
of the column. For example, INT(4) was
read or written using a field with a width of 4. However, if
the column contained wider values, they were dumped to their
full width, leading to the possibility of a
“ragged” field holding values of different
widths. Using a field wide enough to hold all values in the
field prevents this problem. However, data files written
before this change was made might not be reloaded correctly
with LOAD DATA
INFILE for MySQL 5.0.6 and up. This change also
affects data files read by mysqlimport
and written by mysqldump --tab, which use
LOAD DATA
INFILE and
SELECT ... INTO
OUTFILE.

Handling of NULL values varies according to the
FIELDS and LINES options in
use:

For the default FIELDS and
LINES values, NULL is
written as a field value of \N for output,
and a field value of \N is read as
NULL for input (assuming that the
ESCAPED BY character is
“\”).

If FIELDS ENCLOSED BY is not empty, a field
containing the literal word NULL as its
value is read as a NULL value. This differs
from the word NULL enclosed within
FIELDS ENCLOSED BY characters, which is
read as the string 'NULL'.

If FIELDS ESCAPED BY is empty,
NULL is written as the word
NULL.

With fixed-row format (which is used when FIELDS
TERMINATED BY and FIELDS ENCLOSED
BY are both empty), NULL is
written as an empty string. This causes both
NULL values and empty strings in the table
to be indistinguishable when written to the file because both
are written as empty strings. If you need to be able to tell
the two apart when reading the file back in, you should not
use fixed-row format.

An attempt to load NULL into a NOT
NULL column causes assignment of the implicit default
value for the column's data type and a warning, or an error in
strict SQL mode. Implicit default values are discussed in
Section 11.6, “Data Type Default Values”.

Fixed-size rows (FIELDS TERMINATED BY and
FIELDS ENCLOSED BY both empty) and
BLOB or
TEXT columns.

If you specify one separator that is the same as or a prefix
of another, LOAD
DATA INFILE cannot interpret the input properly. For
example, the following FIELDS clause would
cause problems:

FIELDS TERMINATED BY '"' ENCLOSED BY '"'

If FIELDS ESCAPED BY is empty, a field
value that contains an occurrence of FIELDS ENCLOSED
BY or LINES TERMINATED BY
followed by the FIELDS TERMINATED BY value
causes LOAD DATA
INFILE to stop reading a field or line too early.
This happens because
LOAD DATA
INFILE cannot properly determine where the field or
line value ends.

The following example loads all columns of the
persondata table:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

By default, when no column list is provided at the end of the
LOAD DATA
INFILE statement, input lines are expected to contain a
field for each table column. If you want to load only some of a
table's columns, specify a column list:

You must also specify a column list if the order of the fields in
the input file differs from the order of the columns in the table.
Otherwise, MySQL cannot tell how to match input fields with table
columns.

Before MySQL 5.0.3, the column list must contain only names of
columns in the table being loaded, and the SET
clause is not supported. As of MySQL 5.0.3, the column list can
contain either column names or user variables. With user
variables, the SET clause enables you to
perform transformations on their values before assigning the
result to columns.

User variables in the SET clause can be used in
several ways. The following example uses the first input column
directly for the value of t1.column1, and
assigns the second input column to a user variable that is
subjected to a division operation before being used for the value
of t1.column2:

Use of the column/variable list and SET clause
is subject to the following restrictions:

Assignments in the SET clause should have
only column names on the left hand side of assignment
operators.

You can use subqueries in the right hand side of
SET assignments. A subquery that returns a
value to be assigned to a column may be a scalar subquery
only. Also, you cannot use a subquery to select from the table
that is being loaded.

Lines ignored by an IGNORE clause are not
processed for the column/variable list or
SET clause.

User variables cannot be used when loading data with fixed-row
format because user variables do not have a display width.

When processing an input line, LOAD
DATA splits it into fields and uses the values according
to the column/variable list and the SET clause,
if they are present. Then the resulting row is inserted into the
table. If there are BEFORE INSERT or
AFTER INSERT triggers for the table, they are
activated before or after inserting the row, respectively.

If an input line has too many fields, the extra fields are ignored
and the number of warnings is incremented.

If an input line has too few fields, the table columns for which
input fields are missing are set to their default values. Default
value assignment is described in
Section 11.6, “Data Type Default Values”.

These are the same values that result if you assign an empty
string explicitly to a string, numeric, or date or time type
explicitly in an INSERT or
UPDATE statement.

Treatment of empty or incorrect field values differs from that
just described if the SQL mode is set to a restrictive value. For
example, if
sql_mode='TRADITIONAL, conversion
of an empty value or a value such as 'x' for a
numeric column results in an error, not conversion to 0. (With
LOCAL, warnings occur rather than errors, even
with a restrictive sql_mode
value, because the server has no way to stop transmission of the
file in the middle of the operation.)

TIMESTAMP columns are set to the
current date and time only if there is a NULL
value for the column (that is, \N) and the
column is not declared to permit NULL values,
or if the TIMESTAMP column's
default value is the current timestamp and it is omitted from the
field list when a field list is specified.

LOAD DATA
INFILE regards all input as strings, so you cannot use
numeric values for ENUM or
SET columns the way you can with
INSERT statements. All
ENUM and
SET values must be specified as
strings.

BIT values cannot be loaded using
binary notation (for example, b'011010'). To
work around this, specify the values as regular integers and use
the SET clause to convert them so that MySQL
performs a numeric type conversion and loads them into the
BIT column properly:

Here you must run the command that generates the data to be loaded
and the mysql commands either on separate
terminals, or run the data generation process in the background
(as shown in the preceding example). If you do not do this, the
pipe will block until data is read by the mysql
process.

When the LOAD DATA
INFILE statement finishes, it returns an information
string in the following format: