在MySQL中对varchar字段进行数字sorting

我有一个types为varchar的字段number 。 即使它是varchartypes,它也会存储整数值和可选的前导零。 sorting按字典顺序排列( "42""9"之前)。 我怎样才能按数字值( "9"来到"42"之前)?

目前我使用查询:

 SELECT * FROM table ORDER BY number ASC 

有几种方法可以做到这一点:

  1. 将它们存储为数字值而不是string。 你已经打了折扣,因为你想保持string00100完整的前导零。
  2. 按string的顺序排列为数字。 这将工作,但要知道,这是体面的大小的数据库的性能杀手。 每行函数并不能很好地扩展。
  3. 添加第三列,这是相当于该string和索引的数字。 然后使用插入/更新触发器来确保在string列更改时正确设置。

由于绝大多数数据库的读取次数多于写入次数,所以上面的第三个选项将计算(在插入/更新时完成的)所有select的成本进行分摊。 您的select将会非常快速,因为它们使用数字列来sorting(并且没有每行function)。

您的插入和更新速度会更慢,但这是您付出的代价,说实话,这是值得的。

触发器的使用维护了表的ACID属性,因为两列保持一致。 这是一个众所周知的习惯用法,你通常可以在大多数性能优化方面为时间换取空间。

在许多情况下,我们使用这种“技巧”,例如在原件旁边存储较低版本的姓(而不是使用像tolower这样的东西),识别string的长度以find具有7个字符的所有用户(而不是使用len )等等。

请记住,只要您了解(并减轻)后果,就可以从第三种正常forms恢复正常forms。

尝试这个

 SELECT * FROM table_name ORDER BY CAST(field_name as SIGNED INTEGER) ASC 

其实我find了一些有趣的东西:

 SELECT * FROM mytable ORDER BY LPAD(lower(mycol), 10,0) DESC 

这样可以让您按照以下顺序排列字段:

 1 2 3 10 A A1 B2 10A 111 
 SELECT * FROM table ORDER BY number + 0 

捣蛋我刚刚学会了。 将“+0”添加到varchar字段顺序子句中:

 SELECT * FROM table ORDER BY number+0 ASC 

我现在看到上面的答案。 我想知道如果这是typecasting字段和一个整数。 我没有比较performance。 工作很好。

对于有Er353,ER280,ER30,ER36等值的表,默认sorting为ER280 ER30 ER353 ER36

 select fieldname,substring(fieldname, 1, 2) as bcd, CONVERT(SUBSTRING(fieldname, 3, 9),UNSIGNED INTEGER) AS num from table_name order by bcd,num; 

结果将依次为ER30 ER36 ER280 ER353

你可以按照你的要求使用下面的sql查询来获得订单

 SELECT * FROM mytable ORDER BY ABS(mycol) 

给出一个包含VARCHAR的列username如下所示:

 username1 username10 username100 

人们可以这样做:

 SELECT username, CONVERT(REPLACE(username, 'username', ''), UNSIGNED INTEGER) AS N FROM users u WHERE username LIKE 'username%' ORDER BY N; 

这不便宜,但是做这个工作。

SELECT * FROM table ORDER BY number ASC

应该显示你想要它显示..看起来像你正在按idnumbersorting目前没有定义为integer

粗糙和准备:按1 * field_namesorting