在得到一些提示后,我研究了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;
}
void PreciseNow_deinit(UDF_INIT *initid)
{
}
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;
}
它所做的唯一事情就是返回当前系统时间。我将lib文件放在“/usr/lib/mysql/plugin/”中。
其次,在数据库中,我执行了以下查询:
CREATE FUNCTION PreciseNow RETURNS INTEGER SONAME 'libhrt.so'
最后,我将我的时间戳列转换为bigint(8字节整数)。也许这并不是必要的,但由于C函数返回相同的对象类型,所以为什么不呢......
现在运行SQL查询“SELECT PreciseNow()”,我会得到一个微秒精确的内置“NOW()”版本!
由于我对MySQL的知识非常有限,因此我认为这是解决我的问题的完全合法和有效的解决方案?