【问题标题】:MySQL running in Strict Mode and giving me problems. How to fix this?MySQL 在严格模式下运行并给我带来问题。如何解决这个问题?
【发布时间】:2014-02-10 01:24:28
【问题描述】:

我有一个从佛罗里达州下载的 CSV,因此我无法控制文件中的内容。有些字段(例如价格)有时为空。在我导入这些值的表中,我将 sold_price 标记为 BIGINT、无符号、允许 Null 和默认 Null。但是,当我尝试插入 NULL 值(CSV 中的空单元格)时,出现错误:

[PDOException]
SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'sold_price' at row 1

我按照in this answer someone posted 的建议解决了问题。但是,每当 MySQL 重新启动时,我都会再次收到错误,并且必须重新执行该查询。

另外,我认为这不是解决问题的适当方法,是吗?如果 sold_price 等字段为空并且我试图将其插入表中,我应该怎么做?

我正在运行 MySQL 5.6.13 版。

【问题讨论】:

  • '' 不是整数或空值。它是一个空字符串,并且由于您处于严格模式,mysql 不会自动将空字符串转换为 null 或 0 或其他任何内容。无法在 csv 文件中表示 ACTUAL sql null,因此最好使用空字符串。
  • 如果您正在运行 PHP 脚本,您可以检查字段中的正确值并更改导致错误的字段。但在实践中,您应该使用 LOAD DATA INFILE 并利用提供的编辑工具来执行此操作。
  • 我非常喜欢首先将数据加载到临时表中,其中所有列都是大字符串。然后在数据库内部进行转换,这样就可以看到错误在哪里。另外,您可以使用一个查询来完成所有转换。
  • @GordonLinoff,这就是我正在做的事情。我正在尝试将其放入临时表中,但我并没有将所有内容都作为字符串进行。非常有趣的想法。
  • 您可以考虑在加载的第一阶段使用名为heidisql.org 的开源工具。它在整理 csv 文件方面做得不错。

标签: php mysql laravel


【解决方案1】:

您可以禁用严格模式。在你的 my.ini 文件中,你会发现类似

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

将其更改为:

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

【讨论】:

  • 我想我得到的是我真的想禁用严格模式吗?请原谅我在这里的无知,但它的存在大概是有原因的,通过摆脱它,我是否可以为未来的问题做好准备?
  • 这个问题的答案是“视情况而定”:)。如果您能想到自动转换不是您想要的情况,请不要这样做。另一方面,在 5.5(或 5.4?)之前,strict_mode 被默认禁用,因此很长一段时间人们可以在没有 strict_mode 的情况下生活。但是,您也可以始终使用 mysql-function "NULLIF" 将空字符串替换为 NULL-value:NULLIF('',yourvalue)
  • 对不起,NULLIF(yourvalue, '') 不是 NULLIF('', yourvalue)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2015-12-29
  • 2020-08-06
  • 2019-10-14
  • 2020-03-25
  • 2020-02-14
相关资源
最近更新 更多