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
操作相比,LOCAL
修饰符会影响 LOAD DATA
的以下几个方面:
只有当服务器和客户端都配置为允许时,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
,则该文件必须位于服务器主机上。服务器直接读取文件,并按如下方式定位文件:如果文件名是绝对路径名,则服务器按原样使用它。
如果文件名是带有前导组件的相对路径名,则服务器在其数据目录中查找该文件。
如果文件名没有前导组件,则服务器在默认数据库的数据库目录中查找该文件。
如果指定了
LOCAL
,则该文件必须位于客户端主机上。客户端程序读取文件,并按如下方式定位文件:如果文件名是绝对路径名,则客户端程序按原样使用它。
如果文件名是相对路径名,则客户端程序在其调用目录中查找该文件。
使用
LOCAL
时,客户端程序会读取文件并将其内容发送到服务器。服务器会在其存储临时文件的目录中创建该文件的副本。请参阅第 B.3.3.5 节 “MySQL 存储临时文件的位置”。如果该目录中没有足够的空间存储副本,则会导致LOAD DATA LOCAL
语句失败。
非 LOCAL
规则意味着服务器会读取名为 ./myfile.txt
的文件(相对于其数据目录),而它会从默认数据库的数据库目录中读取名为 myfile.txt
的文件。例如,如果在 db1
为默认数据库时执行以下 LOAD DATA
语句,则服务器会从 db1
的数据库目录中读取文件 data.txt
,即使该语句明确将文件加载到 db2
数据库中的表中也是如此:
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
服务器还使用非 LOCAL
规则来为 IMPORT TABLE
语句定位 .sdi
文件。
对于非 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 模式是限制性的,数据解释错误也会变为警告,并且加载操作会继续进行。有关示例,请参阅列值赋值。
要在加载操作期间忽略外键约束,请在执行 LOAD DATA
之前执行 SET foreign_key_checks = 0
语句。
如果在空的 MyISAM
表上使用 LOAD DATA
,则所有非唯一索引都会在一个单独的批处理中创建(与 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 ''
反斜杠是 SQL 语句中字符串内的 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
无法正确读取的输出。例如,如果转义字符为空,则前面显示的输出将如下所示。请注意,第四行中的第二个字段在引号后面包含一个逗号,这(错误地)似乎终止了该字段:
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
对输入解释没有影响。)以 ESCAPED BY
字符开头的 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
处理的规则将在本节后面介绍。字符 转义序列 \0
ASCII NUL ( X'00'
) 字符\b
退格字符 \n
换行(换行符)字符 \r
回车字符 \t
制表符。 \Z
ASCII 26 (Control+Z) \N
NULL 有关
\
转义语法的更多信息,请参阅第 11.1.1 节“字符串字面量”。如果
FIELDS ESCAPED BY
字符为空,则不会进行转义序列解释。对于输出,如果
FIELDS ESCAPED BY
字符不为空,则它将用于在输出中为以下字符添加前缀:FIELDS ESCAPED BY
字符。FIELDS [OPTIONALLY] ENCLOSED BY
字符。如果
ENCLOSED BY
字符为空或未指定,则为FIELDS TERMINATED BY
和LINES TERMINATED 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
值的处理,如下所述。注意如果使用多字节字符集,则固定大小格式不起作用。
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
列中会根据“列值赋值”中描述的规则产生警告或错误。
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 无法确定如何将输入字段与表列匹配。
LOAD DATA
语法中每个 col_name_or_user_var
实例都是列名或用户变量。使用用户变量,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
列的默认值为当前时间戳并且在指定字段列表时从字段列表中省略该列时,才会将 TIMESTAMP
列设置为当前日期和时间。
LOAD DATA
将所有输入视为字符串,因此不能像使用 INSERT
语句那样对 ENUM
或 SET
列使用数值。所有 ENUM
和 SET
值都必须指定为字符串。
不能使用二进制表示法(例如,b'011010'
)直接加载 BIT
值。要解决此问题,请使用 SET
子句删除前导 b'
和尾随 '
,并执行从基数 2 到基数 10 的转换,以便 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)
对于采用 0b
二进制表示法的 BIT
值(例如,0b011010
),请改用以下 SET
子句删除前导 0b
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-2), 2, 10) AS UNSIGNED)
LOAD DATA
支持使用 PARTITION
子句进行显式分区选择,该子句带有一个或多个以逗号分隔的分区、子分区或两者名称的列表。使用此子句时,如果文件中的任何行无法插入到列表中命名的任何分区或子分区中,则该语句将失败并显示错误 找到与给定分区集不匹配的行。有关详细信息和示例,请参阅“第 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
获取前 max_error_count
个警告的列表,作为有关错误发生原因的信息。请参阅第 15.7.7.41 节,“SHOW WARNINGS 语句”。
如果您使用的是 C API,则可以通过调用 mysql_info()
函数来获取有关该语句的信息。请参阅mysql_info()。
对于基于语句的复制,LOAD DATA
被认为是不安全的。如果将 LOAD DATA
与 binlog_format=STATEMENT
一起使用,则要应用更改的每个副本都会创建一个包含数据的临时文件。此临时文件未加密,即使源上启用了二进制日志加密也是如此。如果需要加密,请改用基于行或混合的二进制日志记录格式,因为副本不会为其创建临时文件。有关 LOAD DATA
和复制之间交互的更多信息,请参阅第 19.5.1.20 节,“复制和 LOAD DATA”。
在 Unix 上,如果您需要 LOAD DATA
从管道读取数据,则可以使用以下技术(该示例将 /
目录的列表加载到表 db1.t1
中)
mkfifo /mysql/data/db1/ls.dat
chmod 666 /mysql/data/db1/ls.dat
find / -ls > /mysql/data/db1/ls.dat &
mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE t1" db1
在这里,您必须运行生成要加载的数据的命令和 mysql 命令,这可以在单独的终端上完成,也可以在后台运行数据生成进程(如上例所示)。如果不这样做,管道会阻塞,直到 mysql 进程读取数据。