β

mysql类型转换之str_to_datetime分析

小毛的胡思乱想 6 阅读

解析算法步骤

预处理判断

  1. 跳过开头的空格
  2. 如果剩下为空或者以非数字开头,返回失败
  3. 计算第一部分的内容(包括数字或字符T)
  4. 如果只有一部分,或后面接字符. ,那么属于内部格式

预计年份的长度

  1. 内部格式,长度是4,8,14+的时候,年份是4位,其他是2位
  2. 其他情况,年份是4位

扫描各个部分

  1. 需要重新扫描(第一部分),对每部分进行扫描
  2. 如果是内部格式,扫描固定位数,否则扫描直到非数字,得到这个部分
  3. 如果这部分数值大于999999,返回失败。
  4. 对于每个部分,如果是内部格式,扫描固定长度,否则扫描到出现非数字为止
  5. 每个部分记录得到的数值,原始长度记录长度(可能有前置0),需要记录扫描了几个部分,最后的位置
  6. 如上继续扫描,如果发现了年月日之后,后续可以接字符T,这是特殊情况
  7. 每部分扫描后,跳过中间的间隔,如空格或标点,不同的是,空格不是所有地方都能加,例如年月日后面可以加,年后面就不可以。
  8. 如果扫描到秒这部分,后面如果是符号.的话,还要扫描小数位。

调整结果

  1. 年份原始长度如果是2位,需要做转换处理。
  2. 小数位需要检验长度,对于保留小数位进行处理,可能还要四舍五入
  3. 小数位可能会导致overflow,需要对结果增加一秒
  4. 需要检验日期时间格式各个部分在一定的单位内,特别需要注意闰二月等特殊情况

错误处理

  1. 这个方法很多dirty code,除了返回值,还有flags和warning status
  2. flags用来标记各种解析的选项,会影响解析结果
  3. waring status收集警告信息,有警告可能返回成或失败
源码路径 https://github.com/mysql/mysql-server/blob/23032807537d8dd8ee4ec1c4d40f0633cd4e12f9/sql-common/my_time.c 方法 str_to_datetime
作者:小毛的胡思乱想
原文地址:mysql类型转换之str_to_datetime分析, 感谢原作者分享。

发表评论