6

我正在将 5000 个 csv 文件扫描到数据库中。遗憾的是,文件有 '',为 0。因此,当我运行我的脚本时,它会崩溃。我听说这个错误可以通过简单地禁用严格模式来避免。因此,我尝试禁用严格模式,以允许我将空字符串读取为数字字段的 0。但是错误仍然存​​在。

那么禁用严格模式是否允许将 '' 读入 int 字段?('' 是两个 qoutes 即空字符串)

如果是这样,为什么要设置

sql_mode=''

在 my.ini 配置文件中不能解决问题。

谢谢!

4

4 回答 4

20

LOAD DATA INFILE我猜您使用命令导入 CSV 文件。在执行此命令之前,请键入:

SET sql_mode = '';

有关各种 SQL 模式的更多信息,请参阅文档

于 2012-06-14T19:49:23.533 回答
2

我需要这样做,并正常工作:

  1. 要禁用严格的 SQL 模式,请以 root 身份 SSH 到您的服务器
  2. 创建这个文件:/etc/mysql/conf.d/disable_strict_mode.cnf
  3. 打开文件并输入这两行:

    [mysqld] sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. 使用以下命令重新启动 MySQL:sudo service mysql restart

于 2017-07-12T13:59:43.190 回答
1

您可以修改您的LOAD DATA INFILE语句以更正这些值。这些方面的东西应该起作用。

LOAD DATA INFILE 'filepath.csv'
INTO TABLE MyTable(Column1,@Col2,@Col3)
SET Column2=CASE WHEN @Col2 = '' THEN 0 ELSE @Col2 END
,Column3=CASE WHEN @Col3 = '' THEN 0 ELSE @Col3 END;

此查询将值按原样导入 column1,并修复第 2 列和第 3 列的值。使用它,您不必禁用严格模式,并且您实际上可以控制进入数据库的数据是什么能够以可靠的方式修复它。您还可以使用此功能更改日期格式,或导入十六进制编码的 blob 值。非常有用的功能。

于 2012-06-14T20:00:09.797 回答
0

我把这个放在一个答案中,因为我还没有代表评论你关于设置不是“持有”的后续问题。根据我对 MySQL 的经验,配置文件中的设置仅在启动服务器时读取,因此您必须重新启动服务器才能使新设置生效。

服务器是命令行客户端在运行命令时与之通信的守护进程,因此重新启动命令行客户端实际上不会重新启动服务器本身。

此答案提供了更详细的解释:https ://serverfault.com/a/79051 。

于 2015-03-08T20:42:45.383 回答