Definitivamente debes estar haciendo algo mal. Independiente que sea varchar, el ordena correctamente registros numéricos.
Código sql:
Ver originalmysql> CREATE TABLE orden_id(id VARCHAR(2),nombre text);
Query OK, 0 ROWS affected (0.05 sec)
mysql> INSERT INTO orden_id VALUES('1','nombre1');
Query OK, 1 ROW affected (0.00 sec)
mysql> INSERT INTO orden_id VALUES('4','nombre4');
Query OK, 1 ROW affected (0.00 sec)
mysql> INSERT INTO orden_id VALUES('2','nombre2');
Query OK, 1 ROW affected (0.01 sec)
mysql> INSERT INTO orden_id VALUES('3','nombre3');
Query OK, 1 ROW affected (0.00 sec)
mysql> SELECT *FROM orden_id;
+------+---------+
| id | nombre |
+------+---------+
| 1 | nombre1 |
| 4 | nombre4 |
| 2 | nombre2 |
| 3 | nombre3 |
+------+---------+
4 ROWS IN SET (0.00 sec)
mysql> SELECT *FROM orden_id ORDER BY id;
+------+---------+
| id | nombre |
+------+---------+
| 1 | nombre1 |
| 2 | nombre2 |
| 3 | nombre3 |
| 4 | nombre4 |
+------+---------+
4 ROWS IN SET (0.00 sec)
mysql> SELECT *FROM orden_id ORDER BY CAST(id AS UNSIGNED);
+------+---------+
| id | nombre |
+------+---------+
| 1 | nombre1 |
| 2 | nombre2 |
| 3 | nombre3 |
| 4 | nombre4 |
+------+---------+
4 ROWS IN SET (0.00 sec)
mysql>