我正在将 5000 个 csv 文件扫描到数据库中。遗憾的是,文件有 '',为 0。因此,当我运行我的脚本时,它会崩溃。我听说这个错误可以通过简单地禁用严格模式来避免。因此,我尝试禁用严格模式,以允许我将空字符串读取为数字字段的 0。但是错误仍然存在。
那么禁用严格模式是否允许将 '' 读入 int 字段?('' 是两个 qoutes 即空字符串)
如果是这样,为什么要设置
sql_mode=''
在 my.ini 配置文件中不能解决问题。
谢谢!
我需要这样做,并正常工作:
打开文件并输入这两行:
[mysqld] sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
使用以下命令重新启动 MySQL:sudo service mysql restart
您可以修改您的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 值。非常有用的功能。
我把这个放在一个答案中,因为我还没有代表评论你关于设置不是“持有”的后续问题。根据我对 MySQL 的经验,配置文件中的设置仅在启动服务器时读取,因此您必须重新启动服务器才能使新设置生效。
服务器是命令行客户端在运行命令时与之通信的守护进程,因此重新启动命令行客户端实际上不会重新启动服务器本身。
此答案提供了更详细的解释:https ://serverfault.com/a/79051 。