问题如标题所示,在开发过程的时候,需要创建一张表,从另一个环境导出的表结构sql文件,在我电脑上导入,遇到该报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(0) NULL DEFAULT NULL'
报错的那一行内容为
`refund_success_time` datetime(0) NULL DEFAULT NULL COMMENT '退款成功时间',
宣言博客 Siam 原文链接:https://cloud.tencent.com/developer/article/1571987
将导出的sql导入回原来的环境中(另开一个数据库),测试结果:正常
。
那么sql语句一般是正常没问题的, 一般是环境差异导致的,如(版本不同)
原来的表创建过程是使用软件可视化的,datetime长度这里没有填写,默认是为0,所以首先是对这个的不理解
从这里去找了资料,发现对datetime长度的说明资料很少,但还是有一个百度回答说到了(虽然不够准确)
原文为:
在navicat里面datetime的长度好像指的是秒后面的小数点位数,可以设置为0-6位
不准确的地方有以下
宣言为了测试该问题,并准确定位和分析,找到了mysql官方的文献,原文为:
11.2.7 Fractional Seconds in Time Values MySQL 5.6 has fractional seconds support for TIME, DATETIME, and TIMESTAMP values, with up to microseconds (6 digits) precision: To define a column that includes a fractional seconds part, use the syntax type_name(fsp), where type_name is TIME, DATETIME, or TIMESTAMP, and fsp is the fractional seconds precision. For example:
重点为第一句,mysql在5.6后支持了小数秒,精度高达微秒(6位)
解决该问题(或者说从根源上避免遇到此类问题),应该保证开发环境的一致,同一项目的所有开发人员都应该保持所有环境的版本号一致(最好精确到小版本)
如果只是为了临时在mysql5.5完成测试,并且确认业务程序不需要使用到时间的小数秒,可以将sql文件中的长度设置删除,然后导入
datetime(0) NULL DEFAULT NULL
改为 datetime NULL DEFAULT NULL