MySQL NOW()函数具有高精度

Mar*_*ing 8 mysql

我正在研究一个通过远程MySQL数据库存储其数据的C++应用程序.

其中一项功能是尽可能保持与远程数据保持同步.为此,我使用NOW()函数获取最后的更新时间,并在更新记录时,将last_changed字段设置为NOW().

这项工作现在很好,除了它的最大精度高达一秒的问题.导致数十个重复条目,这会浪费带宽,并且必须手动删除它们.

为了限制大部分膨胀,我希望精度大于此值,最好是高达微秒(如unix gettimeofday()).但是,我在文档中找不到任何有关此内容的信息.我能找到的是NOW()函数使用的是一种变量类型,能够存储高达微秒的精度().但是在使用它时,第二个之后的所有精度都是零.

有没有办法强制Mysql服务器使用更高精度的计时器(并将潜在的性能视为理所当然)?或另一种方法来实现这一目标?

Ben*_*rth 7

在MariaDB中,您可以使用

SELECT NOW(4);
Run Code Online (Sandbox Code Playgroud)

在你的时间戳中获得milisecs.看到这里.


Che*_*ery 6

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

DATETIME或TIMESTAMP值可以包括高达微秒(6位)精度的尾随小数秒部分.尽管可以识别此小数部分,但它会从存储在DATETIME或TIMESTAMP列中的值中丢弃.

使用varchar或text列来保留分数.

ps:MySQL本身无法获得微秒的时间

pps:未来版本除外)) http://dev.mysql.com/doc/refman/5.6/en/news-5-6-4.html

MySQL现在允许TIME,DATETIME和TIMESTAMP值的小数秒,精度高达微秒(6位).要定义包含小数秒部分的列,请使用语法type_name(fsp),其中type_name为TIME,DATETIME或TIMESTAMP,fsp是小数秒精度.

一些表达式产生的结果与以前的结果不同.示例:timestamp系统变量返回一个值,该值包含微秒小数部分而不是整数值.


Mar*_*ing 4

因此,在了解了 MySQL 用户定义的函数后,我终于能够让它工作了。

在 Code::Blocks 中我写了这个简单的库文件

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef long long longlong;    
#include <mysql.h>
#include <ctype.h>    
#include <sys/time.h>
#include <unistd.h>
static pthread_mutex_t LOCK_hostname;
extern "C" longlong PreciseNow(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
extern "C" my_bool PreciseNow_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
extern "C" void PreciseNow_deinit(UDF_INIT *initid);
my_bool PreciseNow_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
 return 0; //optional
}
void PreciseNow_deinit(UDF_INIT *initid)
{ //optional
}

longlong PreciseNow(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
   struct timeval start;
   long mtime, seconds, useconds;
   gettimeofday(&start, NULL);
   return start.tv_sec * 1000000 + start.tv_usec;
}
Run Code Online (Sandbox Code Playgroud)

它唯一做的就是返回当前系统时间。我将 lib 文件放在“/usr/lib/mysql/plugin/”中。其次,在数据库中,我执行了以下查询:

创建函数 PreciseNow 返回整数 SONAME 'libhrt.so'

最后,我将时间戳列转换为 bigint(8 字节整数)。也许这不是必需的,但是看到 C 函数返回相同的对象类型,为什么不......

现在,当运行 SQL 查询“SELECT PreciseNow()”时,我得到了内置“NOW()”的微秒精确版本!由于我对 MySQL 的了解非常有限,我认为这是解决我的问题的完全合法且有效的解决方案?