java使用mysql字段使用text类型踩坑

80 阅读2分钟

场景

公司有个项目是数仓通过 maxcomput 然后导数据到我们项目中 Mysql 8 的库中,数据源是别的项目输出的的数据,每天都会定时输出,其中有一些数据表的字段使用的是 text 字段,我们在开发过程中遇到了不少的坑。

和数仓进行沟通想让他们根据我们这边的类型把 text 类型转换以下,变成我们这边需要的 double、int 类的类型,但是数仓说maxcomput的数据抽取是他们直接通过映射,没办法转换字段的类型(PS:会不会有一种可能他们就是懒得做🤔)

因为有些是需要进行比较,有些是需要进行计算的,mysql 使用 text 类型遇到的第一个坑就是对比的时候。

Text类型对比大小

场景是有两个表的字段进行比对查询A表小于B表的数据,其中A表的类型是 text 类型,B表对应的字段是 double 类型,通过sql进行查询会发现所有的数据都查询出来了。

image.png

明明加了 overall_rating 小于 score_total_threshold 的条件,但是没有生效,以前认为 text 类型会和 varchar 类型相似,在对比的时候可以步转换直接比较大小, text 类型只是很长的 varchar 类型这样的结论,现在通过这个案例貌似是错误的。
然后这个解决办法其实很简单,转换成数值类型就可以了。

image.png

Text类型排序

text 为数值时,直接使用 order by 进行排序是有问题的,虽然是数值但是排序的结果会有错位的情况。例如下面这样:

image.png

会发现明明 11.1100 小,但是降序排序小的大的却在后面,这样的情况处理方式和上面一样,转换成数值型就可以了。

image.png