我使用这一行创建了一个数据库表:
CREATE TABLE mytable(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
uniquename VARCHAR(256) NOT NULL UNIQUE KEY, creationtime TIMESTAMP,
updatedtime TIMESTAMP);
这是我的dapper-dot-net INSERT OR UPDATE命令:
const string uniquename = "25975B8F882E7B1DD99116B71C5A8D04";
// Has format "yyyy-MM-dd HH:mm:ss"
string mysqlTimeStampString = DateTime.UtcNow.ToMysqlTimeStampString();
dbConn.Execute(@"INSERT INTO mytable (uniquename, creationtime,
updatedtime) VALUES (@uniquename, @creationtime, @updatedtime) ON DUPLICATE
KEY UPDATE updatedtime=@updatedtime;", new { uniquename=uniquename,
creationtime = mysqlTimeStampString, updatedtime = mysqlTimeStampString });
第一次运行它之后,我select * from mytable \G
我得到了这个结果:
id: 1
uniquename: 25975B8F882E7B1DD99116B71C5A8D04
creationtime: 2016-01-25 00:06:55
updatedtime: 2016-01-25 00:06:55
到目前为止一切看起来都不错,但是当我几分钟后运行相同的INSERT或UPDATE时,我得到了这个结果:
id: 1
uniquename: 25975B8F882E7B1DD99116B71C5A8D04
creationtime: 2016-01-24 19:10:00
updatedtime: 2016-01-25 00:10:00
这令人费解,原因如下:
updatedtime
字段,但creationtime
和duplicatetime
字段都在更新。为什么两个字段都在更新?mysqlTimeStampString
字符串将两次传递给INSERT OR UPDATE命令。字面意思是一个字符串传入两次,因此creationtime
绝对不可能updatedtime
是本地时间而creationtime
是UTC。在重复更新期间,如果updatedtime
设置为UTC,(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"CustomCell";
CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
[tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];
cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
}
//...
return cell;
}
正在转换为当地时间(UTC -5:00),该怎么可能?我能想到的最好的,这必须是一个精巧的bug,mysql bug,或两者兼而有之,或者我的语法错误。
答案 0 :(得分:2)
creationtime
中,首先定义时间戳firld。根据mysql关于自动初始化timestamp fields的文档:默认情况下,第一个TIMESTAMP列同时具有DEFAULT 如果两者都不是CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 明确指定。
creationtime
字段的c#代码,因此根据mysql服务器的时钟和时区设置设置其值。我在第1点中链接的文档还描述了如何覆盖这些设置,以便mysql不会更新creationtime
字段。解决方案在引用的段落下面描述。