【问题标题】:Load data infile not affecting any rows加载数据文件不影响任何行
【发布时间】:2018-10-28 06:43:54
【问题描述】:

我一直在尝试将我的 user.txt 文件上传到 mysql 工作台,但它不起作用。它运行成功,但没有更新行或列。 它返回

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

谁能告诉我我哪里做错了,我该如何解决这个问题。谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我怀疑 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 上找到的东西


    跟进

    问:“ 我尝试使用\n 以及\r\r\n。这给了我一个错误,说列太大,它被截断了。只有当我这样做时@ 987654329@ 或 \\n 然后只有查询运行。但 30 秒后它说 0 行受到影响。 "

    问:“ 它说在第 1 行被截断,因为它包含比输入字段更多的数据。但我有确切数量的输入字段,因为它需要。所以我猜换行符是不工作。当我执行 '\\r\\n' 时,查询运行但 mysql 服务器连接丢失。可能是因为我的文件太大吗? "

    答:Data truncated for column 警告意味着某个值不“适合”为表中的列分配的存储空间。

    这是否发生在每一列或某些特定列上?第一栏?是否针对第一行和每一行都发出了警告?请注意,警告消息实际上包括列名并标识行。

    (我从来没有真正遇到过 LOAD DATA 的“列太大”错误。)

    实际的警告信息是什么?是错误还是警告? (MySQL返回的输出并不是难以理解的胡言乱语。警告消息包含一些特定信息。将错误消息的文本翻译成“column is too big it truncated”是不必要的混淆。这无助于您实际诊断问题。

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

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

    考虑在 LOAD DATA 语句中显式列出列;并且那些与文件中的字段“对齐”。请注意,我们可以在列表中包含用户定义的变量

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

    第一个字段将加载到第一个列出的标识符中,在这种情况下,userid 作为对main.users 表中名为userid 的列的引用。第二个字段将被加载到第二个列出的列firstname

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


    不要指定'\\n'作为行分隔符;这将导致 LOAD DATA 搜索紧跟“n”的文字反斜杠字符。

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

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

    如果我们不确定,也无法判断,那么进行测试,只指定换行符作为行终止符。

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

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

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

    【讨论】:

    • 我试过用 \n 和 \r 和 \r\n 。这些给我错误说 coloumn 太大了它被截断了。只有当我执行 \\r 或 \\n 时,才会运行查询。但 30 秒后,它说 0 行受到影响
    • 它说在第 1 行被截断,因为它包含比输入字段更多的数据。但我有确切数量的输入字段,因为它需要。所以我猜换行符不起作用。当我执行 '\\r\\n' 时,查询运行但 mysql 服务器连接丢失。会不会是因为我的文件太大?
    • 这个答案真的很有帮助。非常感谢
    • 某些行有太多的字段中断,因为它导致了这些问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多