为何同一条MySQL查询语句在生产服务器可用本地测试服务器不可用?
解决MySQL 5.7插入失败但5.6正常的问题
我帮你梳理下大概率的问题点和解决思路哈:
核心原因:MySQL 5.6与5.7的SQL模式差异
MySQL 5.7默认启用了严格SQL模式(比如包含STRICT_TRANS_TABLES),而5.6默认的模式相对宽松。你的插入语句里给id字段传了空字符串'',如果id是自增主键(比如INT AUTO_INCREMENT PRIMARY KEY类型),5.7的严格模式会直接报错——因为空字符串无法被转换为有效的整数;但5.6的非严格模式会自动把空字符串转成0,进而触发自增逻辑,所以能正常执行。
具体解决办法
1. 最推荐:移除自增主键的插入字段
如果id是自增主键,你完全不需要在INSERT语句里指定它,数据库会自动生成唯一的自增值。修改后的语句如下:
INSERT INTO Article (name, title, author, dateCreate, dateEdit, permissions, template, views, tags) VALUES ('test_show', 'Test Show', '1', '2018-03-24 18:47:09', '2018-03-24 18:47:20', '', '', '', '')
2. 替代方案:将空字符串改为NULL
如果业务上必须保留id字段在INSERT语句里,可以把空字符串''换成NULL,自增主键允许插入NULL来触发自增逻辑:
INSERT INTO Article (id, name, title, author, dateCreate, dateEdit, permissions, template, views, tags) VALUES (NULL, 'test_show', 'Test Show', '1', '2018-03-24 18:47:09', '2018-03-24 18:47:20', '', '', '', '')
3. 不推荐:调整本地SQL模式匹配生产环境
如果你只是临时需要让本地环境和生产保持一致,可以修改本地MySQL的sql_mode:
- 先查询生产环境(DreamHost 5.6)的sql_mode:
SELECT @@sql_mode; - 临时设置本地5.7的sql_mode(重启后失效):
SET GLOBAL sql_mode = '你从生产查到的模式值'; - 永久设置的话,修改
my.cnf(Linux)或my.ini(Windows)文件,添加/修改:
然后重启MySQL服务。sql_mode = "生产环境的模式字符串"
不过这个方法不建议长期用,毕竟严格模式是5.7为了数据安全和规范引入的,适配严格模式才是更合规的做法。
额外验证步骤
先确认下Article表的id字段定义,执行这条语句查看:
DESCRIBE Article;
确认它是否是INT AUTO_INCREMENT PRIMARY KEY类型,这能帮你确定上面哪种方案最适合。
内容的提问来源于stack exchange,提问作者Questioner
相关产品推荐
相关产品推荐

