skynet icon indicating copy to clipboard operation
skynet copied to clipboard

使用MySQL模块查询date类型字段出现解析失败的问题

Open pengwanli opened this issue 10 months ago • 5 comments

在使用MySQL模块查询date类型字段时,报错:_parse_row_data_binary()error,unsupported field type 10

我是这样操作的:

-- day在MySQL中是date类型
local sql = "select day from tab where day = ? "
local stmt_sql = db:prepare(sql)
local res = db:execute(stmt_sql, "2020-01-01")

error

error("_parse_row_data_binary()error,unsupported field type " .. typ)

_parse_row_data_binary()error,unsupported field type 10

错误出现在_parse_row_data_binary方法的 parser = _binary_parser[typ] 语句中,发现是_binary_parser 中没有定义 [0x0a] 的key

我仿照您 _get_datetime的方法写了个_get_date


_binary_parser[0x0a] = _get_date


local function _get_date(data, pos)
    local len, year, month, day
    local value
    len, pos = _from_length_coded_bin(data, pos)
    if len == 4 then
        year, month, day, pos = string.unpack("<I2BB", data, pos)
        value = strformat("%04d-%02d-%02d", year, month, day)
    else
        value = "2017-09-09"
        --unsupported format
        pos = pos + len
    end
    return value, pos
end

改完查询了一下不报错了,麻烦您看下date的这个问题,谢谢!

pengwanli avatar Mar 04 '25 08:03 pengwanli

mysql driver 不是我维护的。你可以提一个 pr 。

cloudwu avatar Mar 04 '25 09:03 cloudwu

另外, unsupported format 这里有什么规范,2017-09-09 是文档要求吗?

cloudwu avatar Mar 04 '25 09:03 cloudwu

另外, unsupported format 这里有什么规范,2017-09-09 是文档要求吗?

这个是参考了_get_datetime方法里面的日期,应该表示给一个默认值,我觉得可能1970-01-01会更好点儿

pengwanli avatar Mar 04 '25 10:03 pengwanli

但我觉得这是一个无法正确解析的协议,不要掩盖异常比较好。

cloudwu avatar Mar 04 '25 14:03 cloudwu

但我觉得这是一个无法正确解析的协议,不要掩盖异常比较好。

好的,我修改一下,当长度不是4的时候改为error("_get_date()error,unsupported date format, len is " .. len)

pengwanli avatar Mar 05 '25 02:03 pengwanli