mysql 导入数据报类型不匹配解决办法

这个报错是因为 SQL 文件中 `endtime` 字段的**默认值设置不符合 MySQL 的 sql_mode 规则**(常见于 MySQL 5.7+ 版本,对时间字段的默认值校验更严格)。我会先解释报错原因,再给你 3 种可操作的解决方案,从临时修复到永久配置都有,你可以按需选择。


### 报错原因说明

MySQL 5.7 及以上版本默认启用了 `NO_ZERO_DATE`、`NO_ZERO_IN_DATE` 等 sql_mode 规则,这些规则会禁止将 `'0000-00-00 00:00:00'` 作为时间字段(如 datetime)的默认值,而你的 SQL 文件第 31270 行正好给 `endtime` 字段设置了这类无效默认值,因此触发 `1067` 错误。


---


### 解决方案(按推荐优先级排序)


#### 方案 1:临时修改 sql_mode(最快,仅当前会话生效)

这种方式无需修改 SQL 文件,先临时关闭严格的时间校验规则,再导入数据:

1. 登录 MySQL 命令行:

   ```bash

   mysql -u root -p

   ```

2. 执行以下命令修改 sql_mode:

   ```sql

   -- 查看当前 sql_mode(可选,用于对比)

   SELECT @@sql_mode;

   -- 关闭 NO_ZERO_DATE、NO_ZERO_IN_DATE 等规则

   SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

   -- 切换到目标数据库

   USE wxmedical;

   -- 导入 SQL 文件(用 / 分隔路径,避免转义)

   SOURCE "E:/Project/DOCTORYU/code/database/wxmedical-26.3.21.sql";

   ```

   执行后等待导入完成即可,此修改仅在当前 MySQL 会话生效,重启 MySQL 后恢复默认。


#### 方案 2:永久修改 MySQL 配置文件(一劳永逸)

如果后续还会导入类似 SQL 文件,建议修改配置文件永久关闭严格时间校验:

1. 找到 MySQL 的配置文件(Windows 通常是 `my.ini`,位置可能在 `C:\ProgramData\MySQL\MySQL Server X.X\my.ini`,注意 `ProgramData` 是隐藏文件夹)。

2. 打开配置文件,在 `[mysqld]` 节点下添加/修改:

   ```ini

   [mysqld]

   sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

   ```

3. 保存文件后,重启 MySQL 服务:

   ```bash

   # 以管理员身份运行 CMD,执行重启命令

   net stop mysql

   net start mysql

   ```

4. 重新执行导入命令:

   ```bash

   mysql -u root -p wxmedical < "E:\Project\DOCTORYU\code\database\wxmedical-26.3.21.sql"

   ```


#### 方案 3:修改 SQL 文件(精准修复)

如果你想保留 MySQL 的严格模式,可直接修改 SQL 文件中 `endtime` 字段的默认值:

1. 用文本编辑器(如 Notepad++)打开 `wxmedical-26.3.21.sql`,定位到第 31270 行。

2. 找到类似以下的字段定义:

   ```sql

   `endtime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT '结束时间',

   ```

3. 将无效默认值改为 `NULL` 或合法时间(如 `1970-01-01 00:00:00`):

   ```sql

   -- 推荐改为 NULL(更合理)

   `endtime` datetime DEFAULT NULL COMMENT '结束时间',

   -- 或改为合法时间

   `endtime` datetime DEFAULT '1970-01-01 00:00:00' COMMENT '结束时间',

   ```

4. 保存文件后,重新执行导入命令即可。


---


### 验证导入结果

导入完成后,执行以下命令确认数据是否正常:

```sql

USE wxmedical;

-- 查看包含 endtime 字段的表结构(替换为实际表名)

DESC 表名;

-- 查看表数据

SELECT endtime FROM 表名 LIMIT 10;

```


### 总结

1. 报错核心原因:MySQL 严格模式禁止 `'0000-00-00 00:00:00'` 作为 datetime 字段默认值。

2. 最快解决:临时执行 `SET sql_mode = '...'` 关闭严格时间校验,再导入数据。

3. 长期方案:修改 MySQL 配置文件 `my.ini` 中的 `sql_mode`,重启服务后永久生效。