在MySQL中强制排序VARCHAR数据

如果发现在MySQL数据库的VARCHAR列中排序数据时遇到问题,则可以尝试以下技巧。

假设您具有值1,200,30,4000和5,并且已将它们按此顺序插入数据库中。在此数据上运行以下查询时:

SELECT numbers FROM TABLE ORDER BY numbers;

可以看到以下输出。

1
200
30
4000
5

尽管它代表顺序,但显然这不是正确的顺序。您可以通过在尝试排序的列后面使用“ +0”来强制自然排序。

SELECT numbers FROM TABLE ORDER BY numbers+0;

这将产生以下输出,该输出按照您希望对一组数字进行排序的方式进行排序。

1
5
30
200
4000

在本质上,这与强制转换number列相同,如以下查询所示。

SELECT NUMBER FROMtest.testsORDER BY CAST(NUMBER AS UNSIGNED);

但是,如果添加一些文本数据会怎样?让我们获取原始数据集并向其中添加两个文本项。它们是“ 1,000”和“文本”。使用默认排序,这两个文本项不受影响,并按照添加的顺序显示。当使用“ +0”方法时,任何稍为数字的内容都会放入列表中,而其他任何内容都将放在数据的开头。

text
1
1,000
5
30
200
4000

使用强制转换方法时,顺序完全相同,但是在这种情况下,MySQL尝试强制转换非数值时会抛出一些异常。

如果要将数字存储在数据库表中,并且必须使用此查询来获取正确的顺序,则可能需要考虑更改表,以便将这些值存储为整数。