我做了什么:
1.exec sql查询并在db ddl之后扫描到struct时获取错误的时间戳数据。
SQL:
SELECT state,round,remark,ctime FROM archive_track WHERE aid=? ORDER BY id DESC
结构:
type Archive struct {
Timestamp time.Time `json:"timestamp"`
State int `json:"state"`
Round int `json:"round"`
Remark string `json:"remark,omitempty"`
}
去代码:
a:=&Archive{}
rows.Scan(&a.State, &a.Round, &a.Remark, &a.Timestamp)
mysql表信息:
CREATE TABLE `archive_track` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT ,
`aid` int(11) NOT NULL DEFAULT '0' ,
`state` tinyint(11) DEFAULT NULL,
`round` tinyint(4) NOT NULL DEFAULT '0' ,
`remark` text COMMENT '其他信息',
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`attribute` mediumint(8) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `ix_aid` (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
表数据:
| id |援助|国家|圆|备注| ctime | mtime |属性|
|:--- | --- | --- | --- | --- | --- | --- | ---:|
| 1 | 1 | 1 | 1 | "" | 2017-03-27 17:07:10 | 2017-03-27 17:07:10 | 0 |
我可以先得到正确的数据:
&a{aid:1,state:1,round:1 ,ctime:1490605630}
但是在db ttl之后得到错误的数据(将state(tinyint)修改为state(int)):
&a{aid:0,state:0,round:0,ctime:-62135596800}.
db ttl:
alter table archive_track modify state int
在重新启动程序之前,我无法获得正确的数据。 重新启动后,我可以获得正确的数据,错误的数据不再出现,但为什么。这让我感到困惑。
*驱动程序版本(或git SHA):QD6LqgLz2JMxXqns8TaxtK9AuHs =
*转到版本:go1.7.4
服务器版本:例如MySQL 5.6,
*服务器操作系统:Linux版本3.16.0-4-amd64
答案 0 :(得分:0)
如果您使用gomysql作为数据库驱动程序,那么当您连接到数据库时,似乎没有为驱动程序启用parseTime DSN parameter。
默认情况下,gomysql不会将Go类型time.Time
扫描到结构中,但它是作为DSN参数实现的。试试这个连接字符串:
connectionString := fmt.Sprintf(`%s:%s@tcp(%s:%s)/%s?parseTime=true`,
DBUsername,
DBPassword,
DBHost,
DBHostPort,
DBName)