在MySQL中插入时间戳值的问题

在MySQL中插入时间戳值的问题,mysql,ado,Mysql,Ado,还有一些其他问题,人们对时间戳都是零有问题。我已经检查过了,这不是重复的 我声明这样一个表: CREATE TABLE `my_db`.`my_table` ( `time_stamp` timestamp NOT NULL, `author` varchar() NOT NULL, `text` text NOT NULL, `md5` int(11) NOT NULL, PRIMARY KEY (`time_stamp`) ) ; 我还有第二个表,它将有一个时间戳作为

还有一些其他问题,人们对时间戳都是零有问题。我已经检查过了,这不是重复的

我声明这样一个表:

CREATE TABLE  `my_db`.`my_table` (
  `time_stamp` timestamp NOT NULL,
  `author` varchar() NOT NULL,
  `text` text NOT NULL,
  `md5` int(11) NOT NULL,
  PRIMARY KEY (`time_stamp`)
) ;
我还有第二个表,它将有一个时间戳作为主键,它们应该有相同的值

在Delphi中编码时,我使用SELECT CURRENT_TIMESTAMP,它返回类似“19/6/2010 4:56:17 AM”的内容,然后在INSERT语句中使用它。插入成功,但时间戳为全零

我做错了什么

以下是插入代码:

  sqlCommand := 'INSERT INTO my_db.my_table(time_stamp, author, text, md5) VALUES ("' 
                   + timestamp + 
                    '", "mawg", ' +
                    '"Hello, world"' +
                    0 +
                    '");';
  Result := DoSQlCommandWithNoResultSet(sqlCommand, AdoConnection);
插入率极低,每隔几周或几个月就有一个条目,所以我很高兴使用时间戳作为主键。我保存着事物的版本,所以时间戳对我来说是有意义的

我恳请大家认为这是一个ADO问题,尽管我希望ADO能够顺利通过。我看不到任何其他解决方案。在控制台中,输出是正确的,但在Delphi中通过ADO运行时,输出是错误的

我可以向MySQL指定日期的格式吗?

看一下。它们非常广泛,具有很高的灵活性

除此之外,我建议您重新考虑您的表结构。timestap作为主键并不完全是您想要的。当您有高流量时,可能会发生时间戳相同的情况。此外,如果在行中保存2条或更多记录,则时间戳将相同。此外,MD5列被设置为int11。MD5哈希使用混合字符,所以我更愿意使用varchar32

CREATE TABLE  `my_db`.`my_table` ( 
  `id` int(11) NOT NULL,
  `timestamp` timestamp NOT NULL,
  `author` varchar(100) NOT NULL,
  `text` text NOT NULL,
  `md5` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ;
看一看。它们非常广泛,具有很高的灵活性

除此之外,我建议您重新考虑您的表结构。timestap作为主键并不完全是您想要的。当您有高流量时,可能会发生时间戳相同的情况。此外,如果在行中保存2条或更多记录,则时间戳将相同。此外,MD5列被设置为int11。MD5哈希使用混合字符,所以我更愿意使用varchar32

CREATE TABLE  `my_db`.`my_table` ( 
  `id` int(11) NOT NULL,
  `timestamp` timestamp NOT NULL,
  `author` varchar(100) NOT NULL,
  `text` text NOT NULL,
  `md5` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ;

查看MySQL文档后,如果时间戳值的格式不正确,通常会导致时间戳为“0000-00-00:00:00”。 在任何情况下,您都不需要指定一个时间戳值,这是timestamp over DATETIME的优点。即使您这样做了,您也可以简单地将其设置为NOW,而不是运行不必要的SELECT语句

编辑:

还有,我知道你说你考虑过了,但是你考虑过夏令时吗?这可能会导致两条记录在秋季时钟倒转时具有相同的时间戳

编辑2:

K、 我不知道为什么我之前没听清楚,但你给出的时间戳格式不正确。尝试插入一个有效的时间戳,如“2010/06/19 4:56:17”。MySQL对日期和时间值的解析非常轻松,但它总是必须是年-月-日期和时-分-秒

编辑3:

好吧,这里似乎有点混乱,所以我将把MySQL 5.0文档页面上的这句话发布在:

对于指定为包含日期部分分隔符的字符串的值,不必为小于10的月或日值指定两位数字“1979-6-9”与“1979-06-09”相同。同样,对于指定为包含时间部分分隔符的字符串的值,不必为小于10的小时、分钟或秒值指定两位数字“1979-10-30 1:2:3”与“1979-10-30 01:02:03”相同


查看MySQL文档后,如果时间戳值的格式不正确,通常会导致时间戳为“0000-00-00:00:00”。 在任何情况下,您都不需要指定一个时间戳值,这是timestamp over DATETIME的优点。即使您这样做了,您也可以简单地将其设置为NOW,而不是运行不必要的SELECT语句

编辑:

还有,我知道你说你考虑过了,但是你考虑过夏令时吗?这可能会导致两条记录在秋季时钟倒转时具有相同的时间戳

编辑2:

K、 我不知道为什么我之前没听清楚,但你给出的时间戳格式不正确。尝试插入一个有效的时间戳,如“2010/06/19 4:56:17”。MySQL对日期和时间值的解析非常轻松,但它总是必须是年-月-日期和时-分-秒

编辑3:

好吧,这里似乎有点混乱,所以我将把MySQL 5.0文档页面上的这句话发布在:

对于指定为包含日期部分分隔符的字符串的值,不必为小于10的月或日值指定两位数字“1979-6-9”与“1979-06-09”相同。同样,对于指定为包含时间部分分隔符的字符串的值,不必为小于10的小时、分钟或秒值指定两位数字1979-10-30 1:2:3“我 这和“1979-10-3001:02:03”一样



AFAIR 19/6/2010 4:56:17 AM不是MySQL日期类型的有效日期格式。您应该将其转换为2010-06-19 04:56:14请参阅。

AFAIR 19/6/2010 4:56:17 AM不是MySQL日期类型的有效日期格式。您应该将其转换为2010-06-19 04:56:14请参阅。

让我们看看执行插入的代码。您确定要使用时间戳字段吗?考虑使用数据类型代替。而且,从现在起不可能有“19/6/2010 4:56:17 AM”_TIMESTAMP@Col.弹片-请记住我是n00b,并解释数据时间与时间戳的优缺点。尽管你说不可能从当前的时间戳中得到“19/6/2010 4:56:17 AM”。我只是再次运行代码,Delphi调试器给出的值为19/6/2010 9:01:35 AM。Xampp…作为一个noob,你可以随时参考手册页来了解解释。哈哈,上校-我不是一个n00b。1 RTFM 2谷歌3询问堆栈溢出,查看插入的代码。您是否绝对确定要使用时间戳字段?考虑使用数据类型代替。而且,从现在起不可能有“19/6/2010 4:56:17 AM”_TIMESTAMP@Col.弹片-请记住我是n00b,并解释数据时间与时间戳的优缺点。尽管你说不可能从当前的时间戳中得到“19/6/2010 4:56:17 AM”。我只是再次运行代码,Delphi调试器给出的值为19/6/2010 9:01:35 AM。Xampp…作为一个noob,你可以随时参考手册页来了解解释。哈哈,上校-我不是一个n00b。1 RTFM 2谷歌3询问堆栈溢出是的,我确实看过。但是我有一个问题,这就是为什么我在这里的原因:-/是的,我已经想到了,时间戳正是我想要的。我需要捕获一个版本,没有其他方法可以做到这一点。是的,时间戳可以同时发生,但我的应用程序是线程化的,带有互斥锁,等等,至少,我想我知道我在做什么;-顺便说一句,谢谢你的帮助replying@hudolejev-我真的需要版本。时间戳是指向其他更正常索引表的第一步索引表的唯一可能键。我可以使用一些非常做作的东西作为PK<,但前提是我要跳过篮圈。作为一个用例,时间戳对于版本来说是有意义的是的,我确实看过它们。但是我有一个问题,这就是为什么我在这里的原因:-/是的,我已经想到了,时间戳正是我想要的。我需要捕获一个版本,没有其他方法可以做到这一点。是的,时间戳可以同时发生,但我的应用程序是线程化的,带有互斥锁,等等,至少,我想我知道我在做什么;-顺便说一句,谢谢你的帮助replying@hudolejev-我真的需要版本。时间戳是指向其他更正常索引表的第一步索引表的唯一可能键。我可以使用一些非常做作的东西作为PK<,但前提是我要跳过篮圈。作为一个用例,时间戳对于版本来说是有意义的。它应该是HH,而不是H,所以2010/06/19 04:56:17是正确的。好的,您可以在一位数的月份/日期/小时/分钟/秒中省略前面的零。在关于非法日期转换为0000-00的部分之后再次检查文档。。。。我认为主要是日期值的顺序把事情搞砸了!在查看MySQL文档之后,如果时间戳值的格式不正确,那么它应该是HH,而不是H-这就是我所想的*但是*我从SELECT CURRENT_TIMESTAMP中获得了值-这可能是Delphi的问题吗?我不知道怎么做-它只是得到一个字符串回来。我猜这是一个德尔菲的问题。您是否有MySQL客户端或访问MySQL客户端?因为如果运行查询:选择当前时间戳;它实际上返回这个:2010-06-1904:22:12。然后用H:MM:SS试一下。它应该在没有0填充的情况下工作。同样地,尝试插入时完全省略时间戳。它应该也能工作。@Lèse majestéI在MySQL日期相关文档中找不到任何关于省略零的内容,但好吧,随它去:它应该是HH,而不是H,所以2010/06/19 04:56:17是正确的。好吧,您可以在个位数的月/日期/小时/分钟/秒中省略前面的零。在关于非法日期转换为0000-00的部分之后再次检查文档。。。。我认为主要是日期值的顺序把事情搞砸了!在查看MySQL文档之后,如果时间戳值的格式不正确,那么它应该是HH,而不是H-这就是我所想的*但是*我从SELECT CURRENT_TIMESTAMP中获得了值-这可能是Delphi的问题吗?我不知道怎么做-它只是得到一个字符串回来。我猜这是一个德尔菲的问题。您是否有MySQL客户端或访问MySQL客户端?因为如果运行查询:选择当前时间戳;它实际上返回这个:2010-06-1904:22:12。然后用H:MM:SS试一下。它应该在没有0填充的情况下工作。同样,通过省略时间来尝试插入
全部夯实。它应该也能工作。@Lèse majesté我在MySQL日期相关文档中找不到任何关于省略零的内容,但好吧,让它成为:+1。奇怪的是,我从MySQL本身获得了带有SELECT CURRENT_TIMESTAMP的字符串。是否有任何函数来规范时间戳?也许STR_to_DATE+但是为什么要用STR_来约会呢?我只是使用nowtrange的retune值。MySQL函数现在应该以有效格式返回时间。如果您使用一些Delphi函数从查询结果中检索该值,我猜是它破坏了时间格式。您可以通过在解析之前打印原始查询结果来检查这一点。+1奇怪的是,我从MySql本身获得了带有SELECT CURRENT_TIMESTAMP的字符串。是否有任何函数来规范时间戳?也许STR_to_DATE+但是为什么要用STR_来约会呢?我只是使用nowtrange的retune值。MySQL函数现在应该以有效格式返回时间。如果您使用一些Delphi函数从查询结果中检索该值,我猜是它破坏了时间格式。您可以通过在解析之前打印原始查询结果来检查这一点。