MySQL迁移数据报错

问题

解决过程

  1. 查看SQL_MODE
show variables like 'sql_mode';

或者:
select @@GLOBAL.sql_mode

发现:

SQL_MODE=`STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,`

就是NO_ZERO_IN_DATENO_ZERO_DATE这两个的锅。

  1. 修改SQL_MODE

只让当前的session生效,执行命令:

 SET @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

如果要让全局生效,在my.cnf里面,把NO_ZERO_IN_DATE,NO_ZERO_DATE去掉,再重启服务器。

拓展知识

MySQL的sql_mode是一个系统变量,它可以影响MySQL SQL语句的执行方式。sql_mode变量包含一系列不同的模式,这些模式可以启用或禁用某些行为和检查。这可以让更好地控制SQL查询的行为,并可以帮助找到并修复潜在的问题。

以下是一些sql_mode常见模式的例子:

  • ONLY_FULL_GROUP_BY:当启用此模式时,GROUP BY子句必须包含所有在SELECT子句中未使用聚合函数的列。这可以防止因依赖于MySQL的扩展GROUP BY行为而产生不确定的结果。

  • STRICT_TRANS_TABLES和STRICT_ALL_TABLES:当启用这些模式时,MySQL将对某些可能更改数据的操作执行更严格的错误检查。例如,试图将一个超出列范围的值插入列将导致错误,而不是将值调整到列范围的最大或最小值。

  • NO_ZERO_DATE,NO_ZERO_IN_DATE和ERROR_FOR_DIVISION_BY_ZERO:当启用这些模式时,MySQL将对日期和零除操作执行更严格的错误检查。

  • NO_AUTO_VALUE_ON_ZERO:启用此模式时,向AUTO_INCREMENT列插入0或NULL将不会生成新的自动增量值,而是将值设为0或NULL。

可以通过以下SQL语句查看当前的sql_mode设置:

SELECT @@sql_mode;

可以通过以下SQL语句设置sql_mode:

SET sql_mode = 'modes';

其中’modes’是想要设置的模式,多个模式之间用逗号分隔。

注意,sql_mode的设置只对当前会话有效。如果想要永久改变sql_mode的设置,需要在MySQL的配置文件中设置。这通常在my.cnf或my.ini文件中的[mysqld]部分进行。

在设置sql_mode时,要小心确保了解每个模式的影响,因为错误的设置可能会导致SQL查询无法按预期运行。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注