代码之家  ›  专栏  ›  技术社区  ›  user7747472

加载不影响任何行的数据填充

  •  1
  • user7747472  · 技术社区  · 7 年前

    我一直在尝试上传我的用户。mysql workbench中的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?

    我的用户。txt有超过10000条记录,记录方式如下

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

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

    1 回复  |  直到 5 年前
        1
  •  4
  •   marc_s    7 年前

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

    我建议你弄清楚线终结者到底是什么。

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

    在Unix/Linux上,行端通常是 '\n' 性格

    我建议你试着和我一起跑步

    LINES TERMINATED BY '\n'
    

    看看这个烟球有多大。

    如果在地址字段的末尾有回车符,这意味着行终止符可能是PC/DOS/Windows样式

    LINES TERMINATED BY '\r\n'
    

    我一点也不知道你是从哪里想出的 '{CR}{LF}' 这听起来像是我们在傻瓜身上发现的


    后续行动

    Q:“ 我试过了 \n 还有 \r \r\n .这些错误告诉我列太大了,它被截断了。只有当我这么做的时候 \\r \\n 然后只运行查询。但30秒后显示0行生效。 "

    Q:“ 它在第1行中表示被截断,因为它包含的数据比输入字段多。但我有确切数量的输入字段。所以我猜断线是行不通的。当我这么做的时候 '\\r\\n' 然后运行查询,但mysql服务器连接丢失。是不是因为我的文件太大了? "

    A:是的 Data truncated for column 警告意味着某个值不“适合”表中该列的分配存储。

    这是发生在每一个专栏,还是某些特定的专栏?第一栏?第一排和每一排都会发出警告吗?请注意,警告消息实际上包括列的名称并标识行。

    (我从来没有在加载数据时遇到过“列太大”错误。)

    实际的警告信息是什么?这是错误还是警告?(MySQL返回的输出并不是不可理解的胡言乱语。警告消息包含一些特定信息。将错误消息的文本翻译为“列太大,它被截断了”是不必要的混淆。这无助于实际诊断问题。

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

    如果你收到MySQL警告1262 Row n was truncated; it contained more data than there were input columns ,这意味着加载数据在文件的行中看到的字段比表中的列数多。

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

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

    第一个字段将加载到第一个列出的标识符中,在本例中, userid 作为对名为 用户ID 在里面 main.users 桌子第二个字段将加载到第二列中 firstname .

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


    不要具体说明 '\\n' 作为行分隔符;这将导致加载数据搜索紧跟“n”的反斜杠字符。

    换行符在MySQL字符串文字中表示为 “\n” .

    这应该可以用来确定线路的终点。我们的问题是,如果它是DOS/Windows PC格式的文件,将有一个回车符,如果我们不指定它作为行终止符的一部分,回车符将是最后一个字段中包含的字符,这可能是我们不想要的。

    如果我们不确定,也说不出来,那么测试一下,只指定换行符作为行终止符。

    如果我们知道行终止符是DOS/Windows PC风格的 “\r\n” ,然后我们可以继续具体说明。

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

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