在MySQL中对varchar字段进行数字sorting
我有一个types为varchar的字段number 。 即使它是varchartypes,它也会存储整数值和可选的前导零。 sorting按字典顺序排列( "42"在"9"之前)。 我怎样才能按数字值( "9"来到"42"之前)? 
目前我使用查询:
 SELECT * FROM table ORDER BY number ASC 
	
有几种方法可以做到这一点:
-  将它们存储为数字值而不是string。 你已经打了折扣,因为你想保持string00100完整的前导零。
- 按string的顺序排列为数字。 这将工作,但要知道,这是体面的大小的数据库的性能杀手。 每行函数并不能很好地扩展。
- 添加第三列,这是相当于该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 
 应该显示你想要它显示..看起来像你正在按id或numbersorting目前没有定义为integer 。 
粗糙和准备:按1 * field_namesorting