LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
该LOAD DATA
语句从文本文件中读取行到表中,以非常高的速度。文件可以从服务器主机或客户端主机读取,取决于是否给出了LOCAL
修饰符。LOCAL
也影响数据解释和错误处理。
LOAD DATA
是SELECT ... INTO OUTFILE
的补充。(见第15.2.13.1节,“SELECT ... INTO语句”。)要将数据从表写入文件,请使用SELECT ... INTO OUTFILE
。要将文件读回表中,请使用LOAD DATA
。这两个语句的FIELDS和LINES子句的语法相同。
该mysqlimport实用程序提供了另一种加载数据文件的方法;它通过将LOAD DATA
语句发送到服务器来操作。见第6.5.5节,“mysqlimport — 数据导入程序”。
关于INSERT
与LOAD DATA
的效率和加速LOAD DATA
的信息,请参见第10.2.5.1节,“优化INSERT语句”。
该LOCAL
修饰符影响LOAD DATA
的以下方面,与非LOCAL
操作相比:
LOCAL
仅在服务器和客户端都配置了允许它的情况下生效。例如,如果mysqld以禁用local_infile
系统变量启动,LOCAL
将产生错误。见第8.1.6节,“LOAD DATA LOCAL的安全考虑”。
文件名必须作为文字字符串给出。在Windows上,指定路径名中的反斜杠作为正斜杠或双反斜杠。服务器使用character_set_filesystem
系统变量指示的字符集来解释文件名。
默认情况下,服务器使用character_set_database
系统变量指示的字符集来解释文件内容。如果文件内容使用不同的字符集,可以使用CHARACTER SET
子句指定该字符集。binary
字符集指定“不进行转换”。
SET NAMES
和character_set_client
的设置不影响文件内容的解释。
LOAD DATA
将文件中的所有字段解释为具有相同的字符集,不管加载到的列的数据类型如何。为了正确解释文件,您必须确保文件是使用正确的字符集编写的。例如,如果您使用mysqldump -T或在mysql中发出SELECT ... INTO OUTFILE
语句写入数据文件,请确保使用--default-character-set
选项将输出写入要使用的字符集,以便在使用LOAD DATA
加载文件时正确解释。
无法加载使用ucs2
、utf16
、utf16le
或utf32
字符集的数据文件。
以下规则确定LOAD DATA
输入文件位置:
-
如果未指定
LOCAL
,文件必须位于服务器主机上。服务器直接读取文件,按照以下方式定位:-
如果文件名是一个绝对路径名,服务器使用它作为给定的。
-
如果文件名是一个相对路径名带有leading组件,服务器在其数据目录中查找文件。
-
如果文件名没有leading组件,服务器在默认数据库的数据库目录中查找文件。
-
-
如果指定了
LOCAL
,文件必须位于客户端主机上。客户端程序读取文件,按照以下方式定位:-
如果文件名是一个绝对路径名,客户端程序使用它作为给定的。
-
如果文件名是一个相对路径名,客户端程序在其调用目录中查找文件。
当
LOCAL
被使用时,客户端程序读取文件并将其内容发送到服务器。服务器在临时文件目录中创建文件的副本。参见 第 B.3.3.5 节,“MySQL 存储临时文件的位置”。如果临时文件目录中没有足够的空间来存储副本,可能会导致LOAD DATA LOCAL
语句失败。 -
非 LOCAL
规则意味着服务器从数据目录中读取名为 ./myfile.txt
的文件,而不是从默认数据库的数据库目录中读取名为 myfile.txt
的文件。例如,如果执行以下 LOAD DATA
语句时,当前数据库为 db1
,那么服务器将从 db1
的数据库目录中读取名为 data.txt
的文件,即使语句明确地将文件加载到 db2
数据库中的表中:
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
服务器还使用非 LOCAL
规则来定位 .sdi
文件,以便 IMPORT TABLE
语句。
对于非 LOCAL
加载操作,服务器从服务器主机上读取文本文件,因此必须满足以下安全要求:
-
您必须拥有
FILE
权限。参见 第 8.2.2 节,“MySQL 提供的权限”。 -
操作受
secure_file_priv
系统变量设置的限制:-
如果变量值是一个非空目录名,则文件必须位于该目录中。
-
如果变量值为空(这是不安全的),则文件只需要由服务器可读。
-
对于 LOCAL
加载操作,客户端程序从客户端主机上读取文本文件。因为文件内容通过客户端连接发送到服务器,因此使用 LOCAL
比服务器直接访问文件慢一些。另一方面,您不需要 FILE
权限,文件可以位于客户端程序可以访问的任何目录中。
REPLACE
和 IGNORE
修饰符控制新行(输入行)与现有表行在唯一键值(PRIMARY KEY
或 UNIQUE
索引值)上的重复:
-
使用
REPLACE
,新行将替换具有相同唯一键值的现有行。参见 第 15.2.12 节,“REPLACE 语句”。 -
使用
IGNORE
,新行将被丢弃。更多信息,请参见 IGNORE 对语句执行的影响。
LOCAL
修饰符具有与 IGNORE
相同的效果。这是因为服务器无法在操作中止传输文件。
如果未指定 REPLACE
、IGNORE
或 LOCAL
,则在找到重复键值时将发生错误,并忽略文本文件的其余部分。
此外,IGNORE
和 LOCAL
也影响错误处理:
-
如果未指定
IGNORE
或LOCAL
,数据解释错误将终止操作。 -
使用
IGNORE
或LOCAL
,数据解释错误将变为警告,并且加载操作将继续,即使 SQL 模式是 restrictiv。例如,参见 列值分配。
要忽略外键约束在加载操作期间,执行 SET foreign_key_checks = 0
语句,然后执行 LOAD DATA
。
如果您使用 LOAD DATA
在空的 MyISAM
表中,所有非唯一索引将在单独的批处理中创建(与 REPAIR TABLE
相同)。通常,这使得 LOAD DATA
在您有许多索引时变得更快。在某些极端情况下,您可以通过使用 ALTER TABLE ... DISABLE KEYS
在加载文件到表之前禁用索引,然后使用 ALTER TABLE ... ENABLE KEYS
在加载文件后重新创建索引。见 第 10.2.5.1 节,“优化 INSERT 语句”。
对于 LOAD DATA
和 SELECT ... INTO OUTFILE
语句,FIELDS
和 LINES
子句的语法相同。两个子句都是可选的,但 FIELDS
必须在 LINES
之前指定。
如果您指定了 FIELDS
子句,每个子子句 (TERMINATED BY
、[OPTIONALLY] ENCLOSED BY
和 ESCAPED BY
) 也都是可选的,除了您必须指定至少一个。这些子句的参数只能包含 ASCII 字符。
如果您没有指定 FIELDS
或 LINES
子句,默认值与以下相同:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
反斜杠是 MySQL 字符串中的转义字符。因此,要指定一个文字反斜杠,您必须指定两个反斜杠,以便值被解释为单个反斜杠。转义序列 '\t'
和 '\n'
分别指定制表符和换行符。
换言之,默认值使 LOAD DATA
在读取输入时按照以下方式操作:
-
在新行处查找行边界。
-
不跳过任何行前缀。
-
在制表符处将行分割成字段。
-
不期望字段被任何引号字符所括起来。
-
将反斜杠前面的字符解释为转义序列。例如,
\t
、\n
和\\
分别表示制表符、换行符和反斜杠。见FIELDS ESCAPED BY
的讨论以获取完整的转义序列列表。
相反,默认值使 SELECT ... INTO OUTFILE
在写入输出时按照以下方式操作:
-
在字段之间写入制表符。
-
不将字段括起来。
-
使用
\
转义字段值中的制表符、换行符或\
实例。 -
在行末写入换行符。
对于在 Windows 系统上生成的文本文件,正确的文件读取可能需要 LINES TERMINATED BY '\r\n'
,因为 Windows 程序通常使用两个字符作为行终止符。某些程序,如 WordPad,可能在写入文件时使用 \r
作为行终止符。要读取这些文件,请使用 LINES TERMINATED BY '\r'
。
如果所有输入行都有一个公共前缀,您想忽略它,可以使用 LINES STARTING BY '
跳过前缀 和它之前的任何内容。如果一行不包含前缀,整个行将被跳过。假设您发出以下语句:prefix_string
'
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
FIELDS TERMINATED BY ',' LINES STARTING BY 'xxx';
如果数据文件看起来像这样:
xxx"abc",1
something xxx"def",2
"ghi",3
结果行将是 ("abc",1)
和 ("def",2)
。文件中的第三行将被跳过,因为它不包含前缀。
该 IGNORE
子句可以用来忽略文件开头的行。例如,您可以使用 number
LINESIGNORE 1 LINES
跳过初始标题行,包含列名:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
当您使用 SELECT ... INTO OUTFILE
与 LOAD DATA
一起将数据库中的数据写入文件,然后稍后将文件读回数据库时,两个语句的字段和行处理选项必须匹配。否则,LOAD DATA
不会正确地解释文件的内容。假设您使用 SELECT ... INTO OUTFILE
将文件写入带逗号分隔的字段:
SELECT * INTO OUTFILE 'data.txt'
FIELDS TERMINATED BY ','
FROM table2;
要读取逗号分隔的文件,正确的语句是:
LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY ',';
如果您尝试使用以下语句读取文件,它将不起作用,因为它指示 LOAD DATA
在字段之间查找制表符:
LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY '\t';
可能的结果是每个输入行将被解释为单个字段。
LOAD DATA
可以用于读取来自外部来源的文件。例如,许多程序可以将数据导出为逗号分隔值(CSV)格式,以便每行字段由逗号分隔,并用双引号括起来,带有初始列名行。如果文件中的行以回车换行对终止,该语句显示了用于加载文件的字段和行处理选项:
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
如果输入值不一定被双引号括起来,请在 ENCLOSED BY
选项前使用 OPTIONALLY
。
任何字段或行处理选项都可以指定为空字符串(''
)。如果不为空,FIELDS [OPTIONALLY] ENCLOSED BY
和 FIELDS ESCAPED BY
值必须是一个字符。FIELDS TERMINATED BY
、LINES STARTING BY
和 LINES TERMINATED BY
值可以是多个字符。例如,要写入以回车换行对终止的行,或者读取包含这些行的文件,请指定 LINES TERMINATED BY '\r\n'
子句。
要读取包含笑话的文件,这些笑话由 %%
分隔的行分隔,可以这样做:
CREATE TABLE jokes
(a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
joke TEXT NOT NULL);
LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes
FIELDS TERMINATED BY ''
LINES TERMINATED BY '\n%%\n' (joke);
FIELDS [OPTIONALLY] ENCLOSED BY
控制字段的引用。对于输出(SELECT ... INTO OUTFILE
),如果您省略单词 OPTIONALLY
,所有字段都将被 ENCLOSED BY
字符括起来。例如,使用逗号作为字段分隔符的输出如下所示:
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
如果您指定 OPTIONALLY
,则 ENCLOSED BY
字符仅用于括起字符串数据类型(例如 CHAR
、BINARY
、TEXT
或 ENUM
)列的值:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
字段值中的 ENCLOSED BY
字符的出现将被 ESCAPED BY
字符前缀逃逸。此外,如果您指定了空的 ESCAPED BY
值,那么可能会生成无法被 LOAD DATA
正确读取的输出。例如,前面的输出将如下所示,如果 escape 字符为空。请注意,第四行的第二个字段包含一个逗号,后跟引号,这(错误地)似乎终止了字段:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
对于输入,ENCLOSED BY
字符,如果存在,将从字段值的末尾剥离。(这适用于 OPTIONALLY
是否指定;OPTIONALLY
对输入解释没有影响。)ENCLOSED BY
字符前缀的出现将被解释为当前字段值的一部分。
如果字段以 ENCLOSED BY
字符开头,实例中的该字符仅在跟随字段或行 TERMINATED BY
序列时被识别为终止字段值。为了避免歧义,在字段值中的 ENCLOSED BY
字符的出现可以被双倍,并被解释为单个字符实例。例如,如果指定 ENCLOSED BY '"'
,引号将被处理如下所示:
"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss -> The "BIG" boss
The ""BIG"" boss -> The ""BIG"" boss
FIELDS ESCAPED BY
控制如何读取或写入特殊字符:
-
对于输入,如果
FIELDS ESCAPED BY
字符不为空,出现该字符将被剥离,紧随其后的字符将被视为字段值的一部分。一些两字符序列是例外,其中第一个字符是转义字符。这些序列在下表中显示(使用\
作为转义字符)。NULL
处理规则将在本节后面描述。Character Escape Sequence \0
ASCII NUL ( X'00'
) 字符\b
退格字符 \n
换行(换行)字符 \r
回车字符 \t
制表符。 \Z
ASCII 26(控制+Z) \N
NULL 有关
\
-escape 语法的更多信息,请参阅 第 11.1.1 节,“字符串字面量”。如果
FIELDS ESCAPED BY
字符为空,则不进行转义序列解释。 -
对于输出,如果
FIELDS ESCAPED BY
字符不为空,则用于前缀以下字符的输出:-
该
FIELDS ESCAPED BY
字符。 -
该
FIELDS [OPTIONALLY] ENCLOSED BY
字符。 -
该
FIELDS TERMINATED BY
和LINES TERMINATED BY
值的第一个字符,如果ENCLOSED BY
字符为空或未指定。 -
ASCII
0
(实际写入的内容是 ASCII0
,而不是零值字节)。
如果
FIELDS ESCAPED BY
字符为空,则不转义任何字符,并将NULL
输出为NULL
,而不是\N
。指定空转义字符可能不是一个好主意,特别是如果您的数据中的字段值包含列表中的任何字符。 -
在某些情况下,字段和行处理选项会相互作用:
-
如果
LINES TERMINATED BY
是空字符串,并且FIELDS TERMINATED BY
不为空,则行也以FIELDS TERMINATED BY
终止。 -
如果
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
值都是空的(''
),则使用固定行(非分隔)格式。在固定行格式中,不使用字段之间的分隔符(但您仍然可以有行终止符)。相反,列值将使用足够宽的字段宽度来读取和写入所有字段值。对于TINYINT
,SMALLINT
,MEDIUMINT
,INT
和BIGINT
,字段宽度分别为 4、6、8、11 和 20,无论声明的显示宽度是什么。LINES TERMINATED BY
仍用于分隔行。如果一行不包含所有字段,则剩余的列将设置为其默认值。如果您没有行终止符,则应将其设置为''
。在这种情况下,文本文件必须包含每行的所有字段。固定行格式也会影响
NULL
值的处理,如后面所述。Note固定大小格式不适用于多字节字符集。
NULL
值的处理根据 FIELDS
和 LINES
选项的使用情况而有所不同:
-
对于默认的
FIELDS
和LINES
值,NULL
将被写入为字段值\N
,用于输出,并且字段值\N
将被读取为NULL
,用于输入(假设ESCAPED BY
字符是\
)。 -
如果
FIELDS ENCLOSED BY
不为空,包含文字NULL
的字段将被读取为NULL
值。这与包含在FIELDS ENCLOSED BY
字符中的文字NULL
不同,后者将被读取为字符串'NULL'
。 -
如果
FIELDS ESCAPED BY
为空,NULL
将被写入为文字NULL
。 -
使用固定行格式(当
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
都为空时),NULL
将被写入为空字符串。这使得NULL
值和空字符串在表中不可区分,因为两者都被写入为空字符串。如果您需要在读取文件时区分这两者,请不要使用固定行格式。
尝试将 NULL
加载到 NOT NULL
列中将产生警告或错误,根据 Column Value Assignment 中的规则。
某些情况不支持 LOAD DATA
:
-
固定大小行(
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
都为空)和BLOB
或TEXT
列。 -
如果您指定了一个分隔符,它是另一个分隔符的前缀,
LOAD DATA
无法正确地解释输入。例如,以下FIELDS
子句将引发问题:FIELDS TERMINATED BY '"' ENCLOSED BY '"'
-
如果
FIELDS ESCAPED BY
为空,字段值包含FIELDS ENCLOSED BY
或LINES TERMINATED BY
后跟着FIELDS TERMINATED BY
值,LOAD DATA
将停止读取字段或行太早。这是因为LOAD DATA
无法正确地确定字段或行值的结束。
以下示例加载 persondata
表的所有列:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
默认情况下,当没有在 LOAD DATA
语句末尾提供列列表时,输入行预计包含每个表列的字段。如果您只想加载表的一些列,请指定列列表:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata
(col_name_or_user_var [, col_name_or_user_var] ...);
您还必须指定列列表,如果输入文件中的字段顺序与表中的列顺序不同。否则,MySQL 无法确定如何将输入字段与表列匹配。
每个实例 col_name_or_user_var
在 LOAD DATA
语法中都是列名或用户变量。使用用户变量,SET
子句使您能够在将结果分配给列之前对其值进行预处理转换。
用户变量在 SET
子句中可以以多种方式使用。以下示例直接使用第一个输入列作为 t1.column1
的值,并将第二个输入列分配给用户变量,然后对其进行除法操作,然后将其用于 t1.column2
的值:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @var1)
SET column2 = @var1/100;
SET
子句也可以用于提供不来自输入文件的值。以下语句将 column3
设置为当前日期和时间:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, column2)
SET column3 = CURRENT_TIMESTAMP;
您还可以通过将输入值分配给用户变量并且不将变量分配给任何表列来丢弃输入值:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3);
使用列/变量列表和 SET
子句受以下限制:
-
SET
子句中的赋值应该只有列名在赋值运算符的左侧。 -
您可以在
SET
赋值的右侧使用子查询。返回值以分配给列的子查询只能是标量子查询。此外,您不能使用子查询来选择要加载的表。 -
被
IGNORE
子句忽略的行不会被处理以供列/变量列表或number
LINESSET
子句使用。 -
由于用户变量没有显示宽度,因此不能在加载固定行格式数据时使用用户变量。
要处理输入行, LOAD DATA
将其拆分为字段,然后根据列/变量列表和 SET
子句(如果存在)使用这些值。然后,将结果行插入表中。如果表具有 BEFORE INSERT
或 AFTER INSERT
触发器,则在插入行之前或之后激活触发器。
字段值的解释和分配到表列取决于以下因素:
-
SQL 模式(
sql_mode
系统变量的值)。模式可以是非限制性的,也可以在各种方式下限制性。例如,可以启用严格的 SQL 模式,或者模式可以包括值,如NO_ZERO_DATE
或NO_ZERO_IN_DATE
。 -
IGNORE
和LOCAL
修饰符的存在或不存在。
这些因素结合起来,通过 LOAD DATA
产生限制性或非限制性的数据解释:
-
如果 SQL 模式是限制性的,并且既没有
IGNORE
也没有LOCAL
修饰符,那么数据解释是限制性的。错误将终止加载操作。 -
如果 SQL 模式是非限制性的,或者指定了
IGNORE
或LOCAL
修饰符,那么数据解释是非限制性的。(特别是,如果省略了REPLACE
修饰符,那么任一修饰符都将覆盖限制性的 SQL 模式。)错误将变为警告,并且加载操作将继续。
限制性数据解释使用以下规则:
-
字段太多或太少将导致错误。
-
将
NULL
(即\N
)分配给非NULL
列将导致错误。 -
超出列数据类型范围的值将导致错误。
-
无效值将产生错误。例如,对于数字列,值
'x'
将导致错误,而不是将其转换为 0。
相比之下,非限制性数据解释使用以下规则:
-
如果输入行具有太多字段,将忽略额外的字段,并增加警告数。
-
如果输入行具有太少字段,将使用默认值分配缺少的列。默认值分配在 第 13.6 节,“数据类型默认值” 中描述。
-
将
NULL
(即\N
)分配给非NULL
列将分配隐式默认值为列数据类型。隐式默认值在 第 13.6 节,“数据类型默认值” 中描述。 -
无效值将产生警告,而不是错误,并将其转换为列数据类型的“最近”有效值。例如:
-
例如,对于数字列,值如
'x'
将被转换为 0。 -
超出范围的数字或时间值将被截断到该列数据类型的最近端点。
-
无效的
DATETIME
、DATE
或TIME
列值将被插入为隐式默认值,无论 SQL 模式NO_ZERO_DATE
设置如何。隐式默认值是该类型的适当“零”值('0000-00-00 00:00:00'
、'0000-00-00'
或'00:00:00'
)。见 第 13.2 节,“日期和时间数据类型”。
-
-
LOAD DATA
将空字段值与缺失字段区别对待:-
对于字符串类型,列将被设置为空字符串。
-
对于数字类型,列将被设置为
0
。 -
对于日期和时间类型,列将被设置为该类型的适当“零”值。见 第 13.2 节,“日期和时间数据类型”。
-
TIMESTAMP
列仅在该列为 NULL
值(即 \N
)且该列未声明允许 NULL
值时,或者 TIMESTAMP
列的默认值为当前时间戳且在字段列表中省略时,才会被设置为当前日期和时间。
LOAD DATA
将所有输入视为字符串,因此您不能像在 INSERT
语句中那样使用数字值 для ENUM
或 SET
列。所有 ENUM
和 SET
值必须作为字符串指定。
BIT
值不能直接使用二进制表示法(例如 b'011010'
)。要解决这个问题,请使用 SET
子句来剥离leading b'
和 trailing '
,并执行二进制到十进制的转换,以便 MySQL 正确地将值加载到 BIT
列中。
$> cat /tmp/bit_test.txt
b'10'
b'1111111'
$> mysql test
mysql> LOAD DATA INFILE '/tmp/bit_test.txt'
INTO TABLE bit_test (@var1)
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-3), 2, 10) AS UNSIGNED);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT BIN(b+0) FROM bit_test;
+----------+
| BIN(b+0) |
+----------+
| 10 |
| 1111111 |
+----------+
2 rows in set (0.00 sec)
对于 BIT
值在 0b
二进制表示法中(例如 0b011010
),请使用以下 SET
子句来剥离leading 0b
:
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-2), 2, 10) AS UNSIGNED)
LOAD DATA
支持使用 PARTITION
子句明确选择分区,使用一个或多个逗号分隔的名称列表。使用该子句时,如果文件中的任何行不能插入到列表中的任何分区或子分区中,则语句将失败,错误为 Found a row not matching the given partition set。有关更多信息和示例,请参阅 第 26.5 节,“分区选择”。
使用 LOW_PRIORITY
修饰符,执行 LOAD DATA
语句将被延迟,直到没有其他客户端从表中读取为止。这只影响使用表级锁定的存储引擎(例如 MyISAM
、MEMORY
和 MERGE
)。
使用 CONCURRENT
修饰符和满足并发插入条件的 MyISAM
表(即表中没有空闲块),其他线程可以在 LOAD DATA
执行时从表中检索数据。这将影响 LOAD DATA
的性能,即使没有其他线程在同一时间使用表。
当 LOAD DATA
语句完成时,它将返回以下格式的信息字符串:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
警告发生在与使用 INSERT
语句插入值时相同的条件下(见 第 15.2.7 节,“INSERT 语句”),除了 LOAD DATA
也生成警告,当输入行中的字段太少或太多时。
您可以使用 SHOW WARNINGS
获取警告列表,了解发生了什么错误。见 第 15.7.7.44 节,“SHOW WARNINGS 语句”。
如果您使用 C API,可以通过调用 mysql_info()
函数获取语句信息。见 mysql_info()。
LOAD DATA
被认为是不安全的语句复制。如果您使用 LOAD DATA
语句与 binlog_format=STATEMENT
,每个副本将创建一个临时文件,包含数据。这个临时文件不加密,即使二进制日志加密在源上启用。如果需要加密,请使用基于行的或混合二进制日志格式,而不是基于语句的格式。更多信息,请参见 第 19.5.1.19 节,“复制和 LOAD DATA”。