C# Dapper - 这个 MySql 有什么问题?
C# Dapper - What is wrong with this MySql?
我使用此行创建了一个数据库 table:
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 插入或更新命令:
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 OR 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
是 UTC 是绝对不可能的。在重复更新期间,creationtime
被转换为本地时间 (UTC -5:00) 而 updatedtime
设置为 UTC,到底是怎么可能的?
据我所知,这一定是一个小错误,mysql 错误,或两者兼而有之,或者我的语法错误。
- 在create table 语句中
creationtime
timestamp firld 首先被定义。根据 mysql 关于自动初始化 timestamp fields 的文档:
By default, the first TIMESTAMP column has both DEFAULT
CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is
specified explicitly.
- 因为是 mysql 而不是更新
creationtime
字段的 c# 代码,所以它的值是根据 mysql 服务器的时钟和时区设置设置的。
我在第 1 点中链接的文档还描述了如何覆盖这些设置,以便 creationtime
字段不会被 mysql 更新。解决方案在引用段落的正下方进行了描述。
我使用此行创建了一个数据库 table:
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 插入或更新命令:
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 OR 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
是 UTC 是绝对不可能的。在重复更新期间,creationtime
被转换为本地时间 (UTC -5:00) 而updatedtime
设置为 UTC,到底是怎么可能的?
据我所知,这一定是一个小错误,mysql 错误,或两者兼而有之,或者我的语法错误。
- 在create table 语句中
creationtime
timestamp firld 首先被定义。根据 mysql 关于自动初始化 timestamp fields 的文档:
By default, the first TIMESTAMP column has both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is specified explicitly.
- 因为是 mysql 而不是更新
creationtime
字段的 c# 代码,所以它的值是根据 mysql 服务器的时钟和时区设置设置的。
我在第 1 点中链接的文档还描述了如何覆盖这些设置,以便 creationtime
字段不会被 mysql 更新。解决方案在引用段落的正下方进行了描述。