String sorting will always give this result, because it works on a character-by-character basis rather than looking at the data as a set of numeric fields.
If you want to sort it by numeric values, you will have to use
SUBSTRING[
^] to extract the numeric portions, and then CAST or CONVERT it to a numeric value. This is going to complicate your SORT BY statement horribly, so I would suggest that you produce an SQL function to extract the relevant field number and return it as an integer for sorting - you will need to
SORT BY extract(myColumn, 1), extract(myColumn, 2),
etc to cope with your multiple numeric values, as well as the text based code at the end.
Good luck! (I think you are going to need it)