Вам может не понравиться это, поскольку вы, вероятно, уже пытаетесь избежать этого, но вместо того, чтобы пытаться сделать какой-то умный трюк, когда у меня были подобные ситуации, я добавляю дополнительный столбец, который хранит varchar в числовом столбце.(обновляется с использованием триггера), и запрос к нему.
Но есть способ, которым я вижу, как это сделать (хотя у меня никогда не было причин делать это в производстве), который заключается в использованиитот факт, что индексирование упорядочит значения по порядку, так что все, что начинается с числа, упорядочено вместе.
Предполагается, что таблица выглядит следующим образом:
CREATE TABLE `test_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`text_or_number` varchar(255),
PRIMARY KEY (`id`),
KEY `test_1_idx` (`text_or_number`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Вы можете выбрать только значения, начинающиеся счисла, используя порядок символов utf8 - http://en.wikipedia.org/wiki/UTF-8#Examples
Наименьшее значение перед 0 в utf-8 - это "/", а наивысшее после него - ":", поэтому следует извлекать только те значения, которые начинаютсяс числом:
select cast(text_or_number as unsigned)
from test_1
where text_or_number < ':'
and text_or_number > '/'
and cast(text_or_number as unsigned) > 0;
Это может по-прежнему содержать значения, начинающиеся с цифры, но не заканчивающиеся на единицу, поэтому я добавил условие cast (...)> 0, но ягоink mysql будет достаточно умен, чтобы выполнять предложения where по порядку, поэтому, надеюсь, он будет выполнять приведение только к подмножеству строк, начинающихся с числового символа.