问题
开发项目中有一张 scores 表用来保存学生的考试成绩,其中有一个 score 字段用来保存总分。业务中有对 score 字段进行排序的需求,但是 sql 语句执行后的结果与预期不一致,如下图所示:
如上图所示,对 score 字段进行降序排序,预期结果应该是 102、101、87…… 而实际却不是。
原因
排序结果与预期不一致的原因在于 score 字段的类型是 varchar,而不是 int 或 double 等数字类型,所以 mysql 在使用 order by 排序时是按照字符串的形式来排序的。你可以从上图中看出来,它是按照 score 字段上的值的首位数字来排序的,所以 87 排在了最前面,而 101 排在了最后面。
解决方法
既然不是按照数值排序,而我们期望是按照数值排序,那解决方法也很简单,把 score 的类型改为数值就好啦。这里有两种修改类型的方法:一是重新设计表,将整张表的 score 字段类型改为整数或浮点数。二是在 sql 语句中将 score 的值转为数值。因为在实际业务中,score 不一定是数字,可以是 A、B、C 这种等级,这也是我们当初把 score 设计为字符串的原因,所以这里我只能采取第二种方法,在 sql 中使用 convert 方法进行类型强转换,如下图所示:
问题解决啦!