首页 > 解决方案 > 将mysql连接器c ++字段值的原始4字节解释为日期

问题描述

在当前数据库中,我从一个宠物表中选择所有,正好有 1 条记录,它有两个 DATE 字段,一个是出生日期,一个是死亡日期。

我的记录有一个出生日期的值和一个 NULL 的死亡日期。

头文件

#include <iostream>
#include <mysqlx/xdevapi.h>

使用指令

using ::std::cout;
using ::std::endl;
using namespace ::mysqlx;

首先我连接会话

Session sess("<session uri>");

然后我输出一些关于表的信息

std::string schema_name = sess.getDefaultSchemaName();
cout << "schema_name : " << schema_name << endl;

Schema db_schema = sess.getSchema( schema_name, true );
std::string table_name { "pet" };

Table pet_table = db_schema.getTable( table_name, true );
cout << "table " << table_name << " has " << pet_table.count() << " row(s). is_view=" << std::boolalpha << pet_table.isView() << std::endl;

最后我准备我的查询

std::stringstream  query_writer;
query_writer << "SELECT * FROM " << table_name;
std::string query_str = query_writer.str();

SqlStatement query = sess.sql(query_str);

然后得到我的结果:

SqlResult res = query.execute();
Row pet;
while( (pet = res.fetchOne()) ) {
    int count = res.getColumnCount();
    for( int column = 0; column < count; column++ ) {
        const Column& current_column = res.getColumn( column );
        const Value& field_value = pet[column];
        const std::string& field_name = current_column.getColumnName();
        Type field_type= current_column.getType();

        // HOW to Interpret this?
        const bytes& raw_bytes = field_value.getRawBytes();
    }
}

有人向我指出,此链接中描述了 DATE 字段编码:

https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html

但非空 DATE 字段 raw_bytes 是 4 个字节长,而不是 3 个字节长,那么正确的文档在哪里?

最初,该表有一个 DATE 字段,现在更改为 DATETIME 字段:

mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | datetime    | YES  |     | NULL    |       |
| death   | datetime    | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

以下是表中的记录:

mysql> select * from pet;
+----------+-------+---------+------+---------------------+-------+
| name     | owner | species | sex  | birth               | death |
+----------+-------+---------+------+---------------------+-------+
| Puffball | Diane | hamster | f    | 1999-03-30 00:00:00 | NULL  |
+----------+-------+---------+------+---------------------+-------+
1 row in set (0.00 sec)

标签: c++mysql-connector

解决方案


推荐阅读