Mysql LOAD DATA INFILE 100,000 条 csv 记录完美但 300,000 条记录 - 插入了 0 行

STW*_*son 5 mysql import csv

以下查询完美导入 100,000,但更大的文件没有任何反应。没有错误,没有加载行。

您可以提供任何线索表示赞赏。我花了几个小时研究最大文件和内存限制并需要帮助。谢谢!

LOAD DATA LOCAL INFILE 'C:\\temp\\masterplay\\bigone.csv'
INTO TABLE mytable
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(`MARK`,`SERIAL NUMBER`, ...thirty some columns...)

0 rows inserted. (Query took 2.2385 sec)
Run Code Online (Sandbox Code Playgroud)

以上在 100,000 条记录上表现完美且快速,对 350,000 条记录没有任何作用。当 CSV 分解为 100,000 多条记录时,导入工作正常。

示例 CSV 文件大小为 314,946 条记录。每行平均 551 个字符。最大行长度为 575。版本:MYSQL 5.6.17、PHP 5.5.12 WAMPSERVER 2.5、Windows 10 Pro 16 GB RAM。无法确定故障模式,因此没有参考文件中的截止。

根据下面的建议,在其他版本和 Linux 上尝试了相同的 SQL,同样的问题。

更新:

下面的想法让我专注于源 CSV 文件。到目前为止,我发现重新保存 CSV(即使它使用 CSV 应用程序检查良好并且在名称和内容上看起来相同)以某种方式修复了文件,以便导入。我有数百个大文件要处理,但不明白有什么区别。

文件以逗号分隔,没有文本分隔符。重新保存文件后,它的内容似乎仍然相同,但文件大小大约增加了 300K。CSV 文件类型是否具有不同的标题或元数据?

STW*_*son 3

使用十六进制编辑器检查文件并显示答案。

我的 CSV 的不同之处在于,行终止于:

十六进制 0D 回车符 (\r),或

十六进制 0D 回车符 (\r) 和 0A 换行符 (\n)

这是代码行:

LINES TERMINATED BY '\r\n'
Run Code Online (Sandbox Code Playgroud)

或者

LINES TERMINATED BY '\r'
Run Code Online (Sandbox Code Playgroud)

就我而言,取出\nCSV 就可以完美导入。

如果此行与 CSV 不匹配,您将得到静默处理。SQL 导入将正常运行,但不会导入任何行。

  • @Vérace是的,使用此测试在使用Powershell的Windows环境中解决了问题: `if (([System.IO.File]::ReadAllBytes("C:\temp\reallyBigFile.csv") | Select-Object -First 1000) -包含 10)` (2认同)