MIN() results are not correct I'm trying to find the the lowest street address number for every street in my area.  My results return the wrong value, so I need help understanding why it's returning the wrong value and how to correct it so I get the desired results.  

I'm using SQLServer 2012

TABLE (A) columns:

ZONE_NUMBER (int, null),
Street_NUMBER (char(10), null),
Street_Name (varchar(255), not null),
Street_Type (char(5), null)


TABLE (A) values:

ZONE_NUMBER | STREET_NUM | STREET_NAME | STREET TYPE |
13             1502         COTTONWOOD    DR
13             1544         COTTONWOOD    DR
13             1564         COTTONWOOD    DR
13             720          COTTONWOOD    DR


Query:

SELECT 
   zone_number,
   min(street_number) as street_number
FROM
   A
GROUP by ZONE_NUMBER


Expected Results:

ZONE_NUMBER | STREET_NUMBER
13            720


Actual Results:

ZONE_NUMBER | STREET_NUMBER
13            1502


If I change from min() to max(), I get my desired results:

ZONE_NUMBER | STREET_NUMBER
13            720


Why?  Is there something I'm missing? 

Also, if '0' Street_number had it's own record, how can I skip '0' and get the next lowest result?

Thanks for any considerations for answering this problem.
Since you are using 2012, you can use TRY_CONVERT as Lamak alluded to if you can't change the street number data type. Note, if you have something other an an INT in this column, then your results will not contain these rows

SELECT 
   zone_number,
   min(try_convert(int,street_number)) as street_number
FROM
   A
GROUP by ZONE_NUMBER