使用MariaDB C++ Connector插入DateTime数据时传入NULL问题求助
这问题我之前帮同事排查过,核心是两个点:MYSQL_TIME结构体的必填字段没初始化,还有bind参数的buffer赋值错了,导致连接器没法正确解析你的时间数据。
问题1:MYSQL_TIME的必填字段未初始化
当你使用MYSQL_TYPE_DATETIME类型时,MariaDB的C连接器会严格校验MYSQL_TIME里的所有时间字段——包括秒(second)和微秒(second_part)。你现在只初始化了年、月、日、时、分,剩下的字段是随机的垃圾值,连接器会判定这个时间无效,直接插入NULL。而MYSQL_TYPE_DATE只校验年月日,所以你能正常插入日期部分。
问题2:bind的buffer赋值错误
你把一个MYSQL_TIME*数组的地址传给了bind[1].buffer,但单条插入的场景下,buffer应该直接指向你的ts变量本身,而不是指针数组。指针数组是批量插入多条数据时才需要用到的配置。
修正后的代码片段
MYSQL_TIME ts; // 初始化所有必填的时间字段,缺一个都可能被判无效 ts.year = 2020; ts.month = 3; ts.day = 19; ts.hour = 8; ts.minute = 5; ts.second = 0; // 必须初始化秒,哪怕设为0 ts.second_part = 0; // 不需要微秒就设为0 ts.neg = 0; // 表示时间为正(非公元前/负时间) // 修正bind参数配置 bind[1].buffer = &ts; // 直接指向MYSQL_TIME变量 bind[1].buffer_type = MYSQL_TYPE_DATETIME; bind[1].u.indicator = &STMT_INDICATOR_NTS; // 单个参数用指针指向指示器更清晰
如果是批量插入场景,你才需要用数组存放多个MYSQL_TIME实例,同时设置bind[1].row_count为插入行数。但从你的代码逻辑来看,单条插入的修改就足够解决问题了。
内容的提问来源于stack exchange,提问作者Jarvum
相关产品推荐
相关产品推荐

