Я искал то же самое и вместо этого закончил делать это - но остался в mysql:
- Установка этой библиотеки udf в mysql, потому что я хотел использовать PCRE.
используя это утверждение
case when version is null then null
when '' then 0
else
preg_replace( '/[^.]*([^.]{10})[.]+/', '$1',
preg_replace('/([^".,\\/_ ()-]+)([".,\\/_ ()-]*)/','000000000$1.',
preg_replace('/(?<=[0-9])([^".,\\/_ ()0-9-]+)/','.!$1',version
)))
end
Я разобью, что это значит:
preg_replace
- это функция, созданная библиотекой UDF. Поскольку это UDF, вы можете просто вызвать его от любого пользователя или пространства баз данных, подобных этому
^".,\\/_ ()
сейчас я рассматриваю все эти символы как разделители или традиционные "точки" в версии
preg_replace('/(?<=[0-9])([^".,\\/_ ()0-9-]+)/','.!$1',version)
означает замену всех не-«точек» и не-чисел, которым предшествует число, которому предшествует «точка» и восклицательный знак.
preg_replace('/([^".,\\/_ ()-]+)([".,\\/_ ()-]*)/','000000000$1.', ...)
означает дополнительно заменить все «точки» действительными точками и дополнить все числа 9-ю нулями. Также любые соседние точки будут уменьшены до 1.
preg_replace( '/0*([^.]{10})[.]+/', '$1', ... )
означает дополнительно сократить все числовые блоки до 10 цифр и сохранить столько блоков, сколько необходимо. Я хотел заставить 6 блоков держать его под 64 байтами, но необходимость в 7 блоках была на удивление обычной и поэтому необходимой для моей точности. Также нужны блоки из 10, поэтому 7 блоков из 9 не вариант. Но переменная длина работает хорошо для меня. - помните, что строки сравниваются слева направо
Так что теперь я могу работать с версиями вроде:
1.2 < 1.10
1.2b < 1.2.0
1.2a < 1.2b
1.2 = 1.2.0
1.020 = 1.20
11.1.1.3.0.100806.0408.000 < 11.1.1.3.0.100806.0408.001
5.03.2600.2180 (xpsp_sp2_rtm.040803-2158)
A.B.C.D = a.B.C.D
A.A < A.B
Я выбрал восклицательный знак, потому что он сортирует в последовательностях сортировки (которые я использую в любом случае) до 0. Его относительная сортировка по 0 позволяет буквам, подобным b и a, при использовании в непосредственной близости от числа выше, обрабатываться как новый раздел и сортировка перед 0 - это заполнение, которое я использую.
Я использую 0 в качестве отступа, чтобы ошибки продавца, такие как переход от фиксированного трехзначного блока к переменному, меня не кусали.
Вы можете легко выбрать больше отступов, если хотите обрабатывать глупые версии, такие как "2.11.0 В разработке (нестабильный) (2010-03-09)" - строка development
составляет 11 байтов.
Вы можете легко запросить больше блоков в окончательной замене.
Я мог бы сделать больше, но я пытался сделать как можно меньше шагов с высокой точностью, поскольку у меня есть несколько миллионов записей для регулярного сканирования. Если кто-то видит оптимизацию, пожалуйста, ответьте.
Я решил оставить его в виде строки, а не в виде числа, потому что приведение имеет стоимость, а также буквы важны, как мы видели. Одна вещь, о которой я думал, это выполнить тест на строке и вернуть опцию, которая не так много проходов или менее дорогая функция для более аккуратных случаев. как 11.1.1.3
очень распространенный формат