在日常开发中经常会遇到MySQL中定义的类型与实际业务中的类型略有个别差异,比如某字典数据我们使用的是0102这种varchar类型的,在我们查询完成后需要将其进行排序,那么如果不转成数值类型的话,默认会按照字典顺序去排序,但是业务中的含义又是要按照数值的大小去排序,所以,此时我们需要在查询的时候将其转换为数值类型,在使用order by去排序。

Impala中,cast函数会经常用到,具体语法cast(field as type)将其转换为你需要的类型,但是我在MySQL中使用cast(type as integer)会出现下面的错误:

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER) FROM PRODUCT LIMIT 0, 30' at line 1

通过查看MySQL官方文档function_cast,发现原来需要转换为SIGNED [INTEGER]就可以了。除此之外还有其他类型的转换.

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

不过,比较奇特的是,我在MariaDB中执行cast(type as integer)就可以,在MySQL中不行,需要修改为cast(type as UNSIGNED)才行。在MariaDB中执行cast(type as UNSIGNED)也是生效的,看来虽然出自同一个源,但还是略有差异,目前这个项目还是混着用这两种库的。看来后面需要统一升级为MySQL 8了。