加载数据infile不影响任何行

时间:2018-05-17 21:42:18

标签: mysql mysqli mysql-workbench

我一直在尝试在mysql workbench中上传我的user.txt文件,但它无法正常工作。它成功运行但没有更新行或列。 它返回

LOAD DATA INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\user.txt' 
 INTO TABLE main.users
 FIELDS TERMINATED BY '|'
 LINES TERMINATED BY '{CR}{LF}'
 IGNORE 1 LINES 0 row(s) affected
 Records: 0  Deleted: 0  Skipped: 0  Warnings: 0    24.860 sec 

我想要执行的代码是

LOAD DATA INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\user.txt' 
INTO TABLE main.users
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '{CR}{LF}'
IGNORE 1 LINES;

如果我将路径名称设为C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\user.txt 它抛出错误

 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 0.000 sec

我也尝试过更改由' \ r \ n'以及' \ r \ n'但没有任何作用。 我也尝试跟踪所有关于此问题的stackoverflow问题,例如 How should I tackle --secure-file-priv in MySQL?

import text file into mysql workbench?

我的user.txt以下列方式拥有超过10,000条记录

UserId|FirstName|LastName|Email|Password|Address
1|John|Doe|johndoe@gmail.com|password|Address
2|John|Doe|johndoe@gmail.com|password|Address

任何人都可以告诉我我在哪里做错了,我该如何解决这个问题。谢谢

1 个答案:

答案 0 :(得分:2)

我怀疑LOAD DATA只看到一行,而IGNORE 1 LINES导致整个文件被读作一行。

我建议你找出线路终结器实际上是什么。

在PC / DOS / Windows上,行尾通常是回车符+换行符,在MySQL中表示为'\r\n'

在Unix / Linux上,行尾通常只是'\n'个字符。

我建议您尝试使用

运行
LINES TERMINATED BY '\n'

看看有多大的烟雾。

如果在地址字段的末尾得到回车字符,则表示行终止符可能是PC / DOS / Windows样式

LINES TERMINATED BY '\r\n'

我还没有找到使用'{CR}{LF}'的线索,这听起来像是我们在w3fools上找到的东西

<强>后续

问:&#34; 我尝试使用\n以及\r\r\n。这些给我的错误说列太大了截断。只有当我执行\\r\\n时,才会运行查询。但是在30秒之后它表示0行受影响。 &#34;

问:&#34; 它在第1行中说截断,因为它包含的数据比输入字段多。但是我需要确切的输入字段。所以我猜测换行不起作用。当我执行'\\r\\n'时,查询运行但mysql服务器连接丢失。可能是因为我的文件大小? &#34;

答:Data truncated for column警告表示某个值不适合&#34;进入表中列的分配存储空间。

是否在每个列或某些特定列上发生了这种情况?第一栏?第一行和每一行都发出了警告吗?请注意,警告消息实际上包含列的名称并标识该行。

(我从未真正遇到&#34;列太大&#34; LOAD DATA错误。)

实际警告信息是什么?这是错误还是警告? (MySQL返回的输出不是难以理解的乱码。警告消息包含一些特定的信息。将错误消息的文本翻译成&#34;列太大,它被截断&#34;是不必要的混淆。那个&#39; ;没有帮助你实际诊断问题。

(我想知道您的客户端是否将警告视为错误?从mysql命令行客户端,我们可以发出SHOW WARNINGS语句。)

如果您收到MySQL警告1262 Row n was truncated; it contained more data than there were input columns,那么这意味着LOAD DATA在文件的行中看到的字段多于表中的列数。

考虑在LOAD DATA语句中明确列出列;那些&#34;排队&#34;与文件中的字段。请注意,我们可以在列表中包含用户定义的变量

LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
( `userid`
, `firstname`
, `lastname`
, `email`
, `password`
, `address`
, @field7
, @field8 
)

第一个字段将加载到第一个列出的标识符中,在本例中为userid,作为userid表中名为main.users的列的引用。第二个字段将加载到第二个列出的列firstname

前缀为符号符号@的标识符是对用户定义变量的引用,而不是表中的列。

不要将'\\n'指定为行分隔符;这将导致LOAD DATA搜索一个文字反斜杠字符,然后紧跟一个&#34; n&#34;。

换行符在MySQL字符串文字中表示为'\n'

这应该可以识别线的末端。我们遇到的问题是,如果它是一个DOS / Windows PC格式的文件,那么它将成为一个回车字符,如果我们不指定它作为行终止符的一部分,那个回车字符将成为最后一个字段的一部分,我们可能不想要。

如果我们不确定,并且无法说明,那么请进行此测试,仅指定换行符作为行终止符。

如果我们知道行终止符是DOS / Windows PC风格的'\r\n',那么我们可以继续并指定它。

(如果该字符串通过bash shell传递,或者其他编程语言解释字符串并在传递给MySQL之前吞下反斜杠字符,我们只需要转义该反斜杠字符。我们不会遇到MySQL命令行客户端中的那个问题。)

我强烈建议我们创建一个较小的文件来测试,可能只包含五行......标题行和四行数据。