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

iq0todco  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(304)

我一直试图上传我的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问题,比如我应该如何处理mysql中的secure file priv?
将文本文件导入mysql工作台?
my user.txt有10000多条记录,如下所示

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

谁能告诉我哪里做错了,我怎么才能解决这个问题。谢谢您

oxiaedzo

oxiaedzo1#

我怀疑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}' 听起来像是我们在傻瓜身上发现的
后续行动
问:“我试过了 \n 还有 \r 以及 \r\n . 这让我错误地说,列太大,它被截断了。只有我知道的时候 \\r 或者 \\n 然后只运行查询。但30秒后显示0行
问:“它说在第一行截断,因为它包含更多的数据,然后输入字段。但我有确切数量的输入字段,因为它需要。所以我猜断线是行不通的。当我这么做的时候 '\\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 ,则这意味着加载数据在文件的行中看到的字段多于表中的列数。
考虑显式列出loaddata语句中的列;这些字段与文件中的字段“对齐”。请注意,我们可以在列表中包含一个用户定义的变量

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

第一个字段将加载到第一个列出的标识符中,在这种情况下, userid 作为对名为 useridmain.users table。第二个字段将加载到第二个列出的列中 firstname .
带有at符号前缀的标识符 @ 是对用户定义变量的引用,而不是表中的列。
不指定 '\\n' 作为行分隔符;这将导致加载数据搜索紧跟“n”的反斜杠字符。
换行符在mysql字符串文字中表示为 '\n' .
这应该可以用来确定线路的尽头。我们的问题是,如果它是dos/WindowsPC格式的文件,将有一个回车字符,如果我们不指定作为行终止符的一部分,回车字符将是最后一个字段中包含的字符,这可能是我们不想要的。
如果我们不确定,也说不出,那么测试一下,只指定换行符作为行终止符。
如果我们知道行终止符是dos/windowspc风格的 '\r\n' ,然后我们可以继续具体说明。
(如果字符串正在通过bashshell或其他解释字符串并在将反斜杠字符传递到mysql之前吞下它们的编程语言传递,那么我们只需要对该反斜杠字符进行转义。我们在mysql命令行客户机中没有遇到这个问题。)
我强烈建议我们创建一个较小的文件来测试,也许只包含五行。。。标题行和四个数据行。

相关问题